从C#启动的bash进程返回意外字符
我从C#启动了bash(cygwin),为此我从从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:\\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
$