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

从C#启动的bash进程返回意外字符,c#,bash,cygwin,io-redirection,mintty,C#,Bash,Cygwin,Io Redirection,Mintty,我从C#启动了bash(cygwin),为此我从C:\\cygwin64\\bin\\bash.exe创建了一个新进程,参数为--login-I。我还重定向了它的输出 Bash运行,但输出包含意外字符,如[0m[37;1m或[0m>或[K>甚至(所有这些字符之前都有ESC字符,但stackoverflow似乎不允许显示).这是出乎意料的,因为我似乎没有看到mintty程序中的任何字符 为什么会发生这种情况?这些字符来自哪里?如何防止它们出现?意外字符是用于格式化文本输出的转义序列(关于终端仿真器

我从C#启动了bash(cygwin),为此我从
C:\\cygwin64\\bin\\bash.exe创建了一个新进程,参数为
--login-I
。我还重定向了它的输出

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


为什么会发生这种情况?这些字符来自哪里?如何防止它们出现?

意外字符是用于格式化文本输出的转义序列(关于终端仿真器)。(有关详细信息,请参阅。)

具体来说,可以使用某些bash变量配置prompt的输出,即。在中,显示了修改它们(只是为了好玩)的效果

在您的情况下,
bash
的调用应该源于一个特殊的脚本,它可以简单地重新定义它们,而无需任何转义序列。因此,您可以摆脱不需要的格式设置。这可能会有所帮助:但这似乎也很有希望:

写这篇文章时,我记得某些命令(例如
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上,它看起来像狂欢节。因此,我使用
hextump
来显示效果:

$ 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
。这个链接提到了
termfo
termcap
,它们可能也是游戏的一部分

因此,除了重新定义
PS1
PS4
,还可以重新定义
术语

$ 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< /代码>中的转义序列是“硬编码的”,即不考虑代码< >术语< /代码>。< /P> 更新:

为了测试这一点,我编写了一个示例脚本
mybashrc

PS1="> "
PS2=">>"
PS3=
PS4="++ "
TERM=
并在Windows 10(64位)上用cygwin中的bash对其进行了测试:

顺便说一句,我注意到[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
后键入了一次[Backspace])原因可能是缺少终端模拟


因此,我相信如果控制台(在您的应用程序中)适当地处理bash输出通道中的退格,这样就不会那么混乱了。

是否有任何命令、参数或参数告诉
bash.exe
程序,以防止它完全添加那些转义序列和颜色代码?我刚刚再次阅读了
manbash
中有关参数影响的内容
-i
-登录
(以及其他)因为我认为这些可能也与您的问题有关。如果我理解正确,这些参数主要定义在启动和退出bash时执行的脚本。这让我相信实际上没有内置的颜色支持。每个格式都是通过配置完成的。因此,上面的提示应该足够了。因此,t解决方案可能是以(附加参数)
--init file
--rcfile
和一个重新定义所述变量的脚本
PS1
PS4
TERM
开始bash。
$ bash --init-file mybashrc -i
> echo "Ha ello"
Hello
> echo "Ha ello" | hexdump -c
0000000   H   e   l   l   o  \n
0000006
> exit
exit

$