意外字符是用于格式化文本输出的转义序列(关于终端仿真器)。(有关此内容的更多信息,请参见Wikipedia:终端仿真器。)
详细地说,提示的输出可以使用某些 bash 变量来配置,即PS1、PS2、PS3、PS4。在如何根据最后一个命令的退出代码更改 bash 提示颜色?,显示了修改它们的效果(只是为了好玩)。
在您的情况下,bash
应该调用一个特殊的脚本来重新定义它们,而无需任何转义序列。因此,您可以摆脱不需要的格式。这可能会有所帮助:SO:在远程主机上运行自定义配置文件,但这似乎也很有希望:是否可以在单行命令中使用自定义位置的配置文件启动 bash shell?.
写到这里,我记得某些命令(例如ls
)也支持彩色输出。因为我不确定我试过这个:
$ mkdir test ; cd test ; touch test1 ; ln -s test1 test2 ; mkdir test3 ; touch test4 ; chmod a+x test4
$ ls --color
test1 test2 test3 test4
$
我不知道如何在这里用颜色格式化它,但在我的 xterm 上,它看起来像 Mardi Gras。因此,我用它hexdump
来展示效果:
$ ls --color | hexdump -c
0000000 t e s t 1 \n 033 [ 0 m 033 [ 0 1 ; 3
0000010 6 m t e s t 2 033 [ 0 m \n 033 [ 0 1
0000020 ; 3 4 m t e s t 3 033 [ 0 m \n 033 [
0000030 0 1 ; 3 2 m t e s t 4 033 [ 0 m \n
0000040
如您所见:ls
确实也使用终端转义序列。然后我想起了变量TERM
。此链接TERM 变量提到了terminfo
或termcap
也可能是游戏的一部分。
因此,除了重新定义PS1
...之外PS4
,重新定义也很有用TERM
:
$ TERM=
$ ls --color | hexdump -c
0000000 t e s t 1 \n t e s t 2 \n t e s t
0000010 3 \n t e s t 4 \n
0000018
$
顺便提一句。我认识到 bash 提示仍然是彩色的。三思而后行变得很明显:PS1
...中的转义序列PS4
是“硬编码”的,即不考虑TERM
.
更新:
为了测试这一点,我编写了一个示例脚本mybashrc
:
PS1="> "
PS2=">>"
PS3=
PS4="++ "
TERM=
并在 Windows 10(64 位)的 cygwin 中使用 bash 对其进行了测试:
$ bash --init-file mybashrc -i
> echo "$PS1 $PS2 $PS3 $PS4"
> >> ++
> exit
exit
$
顺便提一句。我注意到在我的示例会话中 [Backspace] 键的工作方式有些奇怪:它仍然具有预期的效果,但输出错误。输出
不是删除最后一个字符,尽管内部缓冲区似乎可以正确处理:
$ bash --init-file mybashrc -i
> echo "Ha ello"
Hello
> echo "Ha ello" | hexdump -c
0000000 H e l l o \n
0000006
> exit
exit
$
(在这两种情况下,我在 . 之后都输入了 [Backspace] 一次echo "Ha
。)原因可能是缺少终端仿真。
因此,我相信如果控制台(在您的应用程序中)适当地处理 bash 输出通道中的退格,那么它应该不会那么混乱。