0

我从 C# 开始 bash (cygwin),为此我C:\\cygwin64\\bin\\bash.exe使用 arguments创建了一个新进程--login -i。我还重定向了它的输出。

Bash 运行,但输出包含意外字符,例如[0m[37;1mor[0m>[K>or 甚至>ESC在所有这些字符之前都有一个字符,但 stackoverflow 似乎不允许显示它)。这是出乎意料的,因为我似乎没有从 mintty 程序中看到任何这些字符。

为什么会这样?这些角色是从哪里来的?我怎样才能防止它们出现?

4

1 回答 1

0

意外字符是用于格式化文本输出的转义序列(关于终端仿真器)。(有关此内容的更多信息,请参见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 变量提到了terminfotermcap也可能是游戏的一部分。

因此,除了重新定义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 输出通道中的退格,那么它应该不会那么混乱。

于 2017-04-20T10:50:02.470 回答