从 C# 启动的 bash 进程返回意外字符



我从 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 变量也提到了可能是游戏一部分的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
$

(在这两种情况下,我在CC_23之后键入了一次[退格键]。原因可能是缺少终端仿真。

因此,我相信如果控制台(在您的应用程序中)适当地处理 bash 输出通道中的退格键,那么它应该不那么令人困惑。

相关内容

  • 没有找到相关文章

最新更新