2017-04-20 61 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