2017-04-20 82 views
0

我从C#开始创建bash(cygwin),为此我创建了一个C:\\cygwin64\\bin\\bash.exe的新进程,参数为--login -i。我也重定向了它的输出。从C#开始的bash进程返回意外字符

猛砸运行,但输出包含意外的字符,如[0m[37;1m[0m>[K>甚至>(有所有这些之前ESC字符,但计算器似乎并没有让它显示)。这是意想不到的原因,我似乎没有看到任何来自mintty程序的这些角色。

这是怎么发生的?这些角色来自哪里?我怎样才能防止他们出现?

回答

0

意外字符是用于格式化文本输出的转义序列(涉及终端模拟器)。 (有关更多信息,请参见Wikipedia: terminal emulator。)

详细地说,可以使用某些bash变量来配置提示输出,即PS1, PS2, PS3, PS4。在How to change bash prompt color based on exit code of last command?中,显示了修改它们(仅用于娱乐)的效果。

在你的情况下,bash的调用应该来源于一个特殊的脚本,它不需要任何转义序列就可以重新定义它们。因此,你可以摆脱不需要的格式。这可能有所帮助:SO: Running a custom profile file on remote host但这似乎也很有希望:Is it possible to start a bash shell with a profile at a custom location, in a one liner command?

写这个,我记得某些命令(例如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。这个链接The TERM variable提到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= 

,并使用bash Cygwin中测试了它在Windows 10(64位):

$ bash --init-file mybashrc -i 
> echo "$PS1 $PS2 $PS3 $PS4" 
> >> ++ 
> exit 
exit 

$ 

Btw。我注意到[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后输入后退键一次。)原因可能是缺少终端仿真。因此,我相信如果控制台(在您的应用程序中)适当地处理了bash的输出通道中的退格,那么它应该不那么令人困惑。

+0

是否有任何命令或参数或参数来告诉'bash.exe'程序阻止它完全添加这些转义序列和颜色代码? – newpeople

+0

我刚刚阅读了关于参数'-i'和'--login'(以及其他参数)影响的'man bash'again,因为我的想法是这些也可能与您的问题有关。如果我理解正确,这些参数主要定义在启动和退出bash时执行哪些脚本。这让我相信实际上没有内置的颜色支持。每种格式都通过配置完成。因此,上述提示应该足够了。 – Scheff

+0

因此,解决方案可能是使用(附加参数)'--init-file'或'--rcfile'和一个脚本重新定义所提到的变量'PS1' ...'PS4'和' TERM'。 – Scheff