意外字符是用於格式化文本輸出的轉義序列(涉及終端模擬器)。 (有關更多信息,請參見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提到terminfo
或termcap
也可能是遊戲的一部分。
因此,除了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的輸出通道中的退格,那麼它應該不那麼令人困惑。
是否有任何命令或參數或參數來告訴'bash.exe'程序阻止它完全添加這些轉義序列和顏色代碼? – newpeople
我剛剛閱讀了關於參數'-i'和'--login'(以及其他參數)影響的'man bash'again,因爲我的想法是這些也可能與您的問題有關。如果我理解正確,這些參數主要定義在啓動和退出bash時執行哪些腳本。這讓我相信實際上沒有內置的顏色支持。每種格式都通過配置完成。因此,上述提示應該足夠了。 – Scheff
因此,解決方案可能是使用(附加參數)'--init-file'或'--rcfile'和一個腳本重新定義所提到的變量'PS1' ...'PS4'和' TERM'。 – Scheff