当通过 ssh 在服务器内运行时,我的 bash 脚本运行时噪音更大。
+ 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:
Run Code Online (Sandbox Code Playgroud)
我在那里看到的建议之一是做 export TERM=linux
有没有副作用?在脚本的开头这样做是否是个好主意,如下所示:
#!/bin/bash
set -e
set -x
TERM=linux
Run Code Online (Sandbox Code Playgroud)
该export TERM=linux命令将终端模拟器设置为linux. 根据您使用的控制台的环境和功能,某些仿真会比其他仿真效果更好。
Ubuntu的默认TERM设置是xterm. 您可以通过运行来检查您的 TERM 设置echo $TERM。
您可能需要咨询您正在运行的应用程序的提供商,以找出最适合他们程序的终端仿真器。大多数应用程序都希望您已经将模拟器设置为兼容的内容,例如xterm或linux。
set -x
调试设置:
您指的是嘈杂的脚本。由于set -x用于调试的设置,您会从脚本中获得详细的输出。一旦您看到正在发生的事情并让您的脚本按照您希望的方式运行,您就可以set -x通过在该行#前面放置符号来注释掉该行。
set -e
此设置告诉脚本在出现命令错误时退出。例如,如果您的命令是将目录更改为不存在的目录或列出不存在的文件,则脚本将在出现错误时终止,而不是继续执行下一行。
您ssh登录的通过服务器的问题可能导致,默认情况下,服务器会尝试匹配您登录的计算机上设置的终端模拟器。如果它没有匹配项,则它不知道您可以处理哪些设置。为此,您必须使用该export TERM命令向服务器指定如何与您通信。
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.
Run Code Online (Sandbox Code Playgroud)
请注意这些错误:
debconf:(对话前端将无法在哑终端、emacs shell 缓冲区或没有控制终端的情况下工作。) ... debconf:(这个前端需要一个控制 tty。)
根据 GNU gettext 手册页,TERM变量“...包含文本窗口功能的标识符”。换句话说,它只是告诉系统您应该使用哪种终端以及屏幕上的文本应该如何调整。
TERM=linux 意味着你应该使用 Linux 控制台,所以输出将是简约的,可能不支持某些语言。
正如穆鲁指出的那样,您确实需要分配一个伪 tty。改变TERM变量可能有帮助,但TERM=linux 不是你想要的。您没有使用实际的 Linux 控制台。-tssh的 选项会是更好的方法。