小编Moo*_*eep的帖子

适用于串行控制台的 TERM 变量值

要在 Linux 上启用串行控制台,可以使用getty(最常见的是它的变体agetty)。该二进制文件将用于初始化TERM变量的值作为参数。

在 Debian 上,使用 Sys V init,默认值为 vt100。在 systemd 中,默认值曾经是vt102,现在是vt220

在玩了一些 QEMU 虚拟机和virt-viewer,以及virsh console命令之后,我注意到了一些事情:

  • 使用vt100ls --color显示颜色,但vim语法高亮不起作用
  • 使用vt102vt220,它们都不显示颜色
  • 只有TERM变量设置为Linux的,两者都做ls,并vim使用颜色

所以我想独立于实际的“颜色支持”,每个应用程序都会查看TERM变量并相应地采取行动,这将解释上述差异。

阅读Serial Console HOWTO 后,我了解到TERM变量的值应取决于将连接到串行端口的物理终端的实际型号,根据其功能。

请注意,根据Lennart Poettering 的博客TERM应仅使用真实虚拟终端(而不是串行终端)设置为linux。另一方面,Arch Linux 的 Wiki似乎并不介意(请参阅/etc/inittab …

linux serial-port console serial-console

5
推荐指数
1
解决办法
1478
查看次数

systemd下破折号最大可变长度

我有一个 shell 脚本,它使用单个变量作为关联数组(KEY=VALUE每行一个)。

在脚本的整个执行过程中,变量被操纵以添加、删除或修改条目:

附加:

VARIABLE="$(printf "%s\n%s" "$VARIABLE" "KEY=VALUE")"
Run Code Online (Sandbox Code Playgroud)

调整:

VARIABLE="$(printf "%s\n" "$VARIABLE" | sed -E "s,^(KEY=).*$,\1VALUE,")"
Run Code Online (Sandbox Code Playgroud)

消除:

VARIABLE="$(printf "%s\n" "$VARIABLE" | grep -E -v "^KEY=.*$")"
Run Code Online (Sandbox Code Playgroud)

在终端中执行时(或作为sysv下的旧机器上的服务通过 init 脚本),该脚本运行良好,但是当作为systemd下的服务运行时,一段时间后,脚本开始在日志 :

sh: printf: I/O error

经过大量的反复试验,我无法确定脚本中的哪些命令产生了这些错误,但我注意到当变量的长度达到 8000 字节时它们开始出现(我猜是 8192,但我由于附加了整行,因此无法准确指出它)。

我很确定变量长度是问题所在,因为我实现了一个例程,当变量长度接近 8192 字节时,它会修剪数组中最旧的条目,现在脚本确实运行systemd了很长时间而没有错误;但这当然不理想,因为会丢失一些信息。

我在网上搜索了有关 shell 脚本中最大可变长度的信息,但没有找到任何有用的信息:

  • dash 手册页没有说明最大可变长度。

  • GNU sed 文档说:

对于那些想要编写可移植sed脚本的人,请注意某些实现已将行长度(对于模式和保持空间)限制为不超过 4000 字节。的POSIX标准规定符合sed的实施方式应支持至少8192米字节行的长度。GNU sed没有内置的行长限制;只要它可以malloc()更多(虚拟)内存,您就可以随心所欲地馈送或构造行。

...但这适用于行长,而不是整个文本长度(单行不超过 80 个字符)

无论如何,由于错误仅在脚本运行时出现 …

dash shell-script limit systemd

5
推荐指数
1
解决办法
262
查看次数