意外字符是用于格式化文本输出的转义序列(涉及终端模拟器)。 (有关更多信息,请参见Wikipedia: terminal emulator。)
详细地说,可以使用某些bash变量来配置提示输出,即PS1, PS2, PS3, PS4。在How to change bash prompt color based on exit code of last command?中,显示了修改它们(仅用于娱乐)的效果。
在你的情况下,bash
的调用应该来源于一个特殊的脚本,它不需要任何转义序列就可以重新定义它们。因此,你可以摆脱不需要的格式。这可能有所帮助:SO: Running a custom profile file on remote host但这似乎也很有希望:Is it possible to start a bash shell with a profile at a custom location, in a one liner command?。
写这个,我记得某些命令(例如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,它看起来像狂欢节。因此,我用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
。这个链接The TERM variable提到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=
,并使用bash Cygwin中测试了它在Windows 10(64位):
$ bash --init-file mybashrc -i
> echo "$PS1 $PS2 $PS3 $PS4"
> >> ++
> exit
exit
$
Btw。我注意到[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
$
(在这两种情况下,我echo "Ha
后输入后退键一次。)原因可能是缺少终端仿真。因此,我相信如果控制台(在您的应用程序中)适当地处理了bash的输出通道中的退格,那么它应该不那么令人困惑。
是否有任何命令或参数或参数来告诉'bash.exe'程序阻止它完全添加这些转义序列和颜色代码? – newpeople
我刚刚阅读了关于参数'-i'和'--login'(以及其他参数)影响的'man bash'again,因为我的想法是这些也可能与您的问题有关。如果我理解正确,这些参数主要定义在启动和退出bash时执行哪些脚本。这让我相信实际上没有内置的颜色支持。每种格式都通过配置完成。因此,上述提示应该足够了。 – Scheff
因此,解决方案可能是使用(附加参数)'--init-file'或'--rcfile'和一个脚本重新定义所提到的变量'PS1' ...'PS4'和' TERM'。 – Scheff