使用函数和ANSI控制序列的奇数源bash行为

时间:2015-06-17 15:09:33

标签: bash terminal

function tc() { echo -ne "\033]0;$1\007"; }

function justecho() { echo z$1$1z; }

HOSTNAME=$(hostname)

tc hello #works
#tc $(hostname)
justecho $(hostname) #works

以上内容保存在名为testbash.txt的文件中,调用如下: source testbash.txt

注释掉的行无法按预期工作。另外两个函数调用按预期工作。如何将主机名传递给函数tc? TC在终端窗口中更改选项卡名称,如果传递了文字字符串(即tc hello),则按预期工作。如果代码不清楚,我可以提供更多信息。

1 个答案:

答案 0 :(得分:0)

如果没有更多信息(你正在使用哪个shell,你的主机名是什么,非工作行的输出是什么),很难说出究竟是什么破坏了。

可能的原因是您的ANSI控制序列被破坏(不完整),并且它的部分或完全吞下了它后面的字符串,具体取决于您的终端的实现以及字符串是什么。

我不确定你要对\033]0;做些什么。我猜测它与颜色或字体大小有关,在这种情况下,您可能正在寻找\033[0m(“重置颜色”序列)。控制序列以“m”结尾,并使用“;”作为可能参数之间的内部分隔符(例如\033[0;32;40m指定字体宽度为0,前景色为32 /绿色和背景色40 /黑)。

在线资源很多,您可以了解可能的控制序列。例如:Using ANSI color codes

作为一般建议,请记住这些:

  • 将参数引用到tc:tc "$(hostname)"(我还没有听说过包含空格的主机名,但它不会受到伤害)。
  • 请注意-n的{​​{1}}参数,使其不输出新行。当您查看终端上的输出时,这可能会使您感到困惑,特别是如果您有一个带有控制字符的更高级提示,可能“吃掉”您当前的线路。要验证这一点,请在调用函数后生成一个新行:echo - 并查看它是否更好。
  • 确保您的tc "$(hostname)"; echo命令存在并且可以调用
  • 了解/计划您的脚本的目的。如果将其用作另一个命令的输入,则控制序列很可能会导致意外行为。即使执行hostname也会出错,更不用说使用testbash.txt | less或其他解析工具了。

编辑:您的控制序列旨在设置终端标题并且看起来正确,如评论部分所述。请尝试上述其他建议和/或提供其他信息。