当我的 bash 脚本通过 ssh 在服务器内部运行时,会产生额外的噪音。
+ sudo apt-get install -yqq nodejs
debconf: unable to initialize frontend: Dialog
debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
我看到的一个建议是执行 export TERM=linux
有什么副作用吗?在脚本开头这样做是个好主意吗,如下所示:
#!/bin/bash
set -e
set -x
TERM=linux
答案1
该export TERM=linux
命令将终端仿真器设置为linux
。根据您使用的控制台的环境和功能,某些仿真器的效果会比其他仿真器更好。
默认学期Ubuntu 的设置是xterm
。您可以通过运行来检查您的 TERM 设置echo $TERM
。
您可能需要咨询正在运行的应用程序的提供商,以找到最适合其程序的终端仿真器。大多数应用程序都希望您已将仿真器设置为兼容的,例如xterm
或linux
。
设置-x
调试设置:
您引用了一个嘈杂的脚本。由于用于调试的设置,您从脚本中获得了详细的输出。一旦您看到正在发生的事情并让您的脚本按您想要的方式运行,您可以通过在行前面放置符号set -x
来注释掉该行。set -x
#
设置-e
此设置告知脚本在命令错误时退出。例如,如果您的命令是将目录更改为不存在的目录或列出不存在的文件,则脚本将在出现错误时终止,而不是继续执行下一行。
ssh
您登录的服务器出现的问题可能会导致服务器默认尝试匹配您登录的计算机的终端仿真器设置。如果没有匹配,则服务器不知道您可以处理哪些设置。为此,您必须使用export TERM
命令来指定服务器如何与您通信。
答案2
TERM
如果没有分配 TTY,则设置没有意义。如果您使用 SSH,请使用ssh -t
:
-t Force pseudo-tty allocation. This can be used to execute
arbitrary screen-based programs on a remote machine, which can be
very useful, e.g. when implementing menu services. Multiple -t
options force tty allocation, even if ssh has no local tty.
请注意这些错误:
debconf:(对话框前端无法在哑终端、emacs shell 缓冲区或没有控制终端。 ... debconf:(这个前端需要控制 tty。
答案3
根据 GNUgettext 手册页面上,TERM
变量“...包含文本窗口功能的标识符”。换句话说,它只是告诉系统您应该使用哪种终端以及屏幕上的文本应如何调整。
TERM=linux
意味着您将要使用 Linux 控制台,因此输出将是最简单的,可能不支持某些语言。
正如 muru 指出的那样,您确实需要分配一个伪 tty。更改TERM
变量可能会有所帮助,但这TERM=linux
不是您想要的。您没有使用实际的 Linux 控制台。ssh 选项 -t
会是更好的方法。