我从 C# 开始了 bash(cygwin),为此目的,我从C:\cygwin64\bin\bash.exe
创建了一个带有参数--login -i
的新进程。我还重定向了它的输出。
Bash 运行,但输出包含意外字符,如[0m[37;1m
或[0m>
或[K>
甚至>
(在所有这些字符之前都有一个ESC
字符,但 stackoverflow 似乎不允许它显示)。这是出乎意料的,因为我似乎没有从薄荷糖程序中看到任何这些角色。
为什么会这样?这些角色来自哪里?如何防止它们出现?
意外字符是用于格式化文本输出的转义序列(与终端仿真器有关)。(请参阅维基百科:终端模拟器
以获取更多信息。详细地说,提示的输出可以使用某些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上,它看起来像狂欢节。因此,我使用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
$
(在这两种情况下,我在CC_23之后键入了一次[退格键]。原因可能是缺少终端仿真。
因此,我相信如果控制台(在您的应用程序中)适当地处理 bash 输出通道中的退格键,那么它应该不那么令人困惑。