Linux
將bash提示重定向到文件時的奇怪輸出
我將 bash 命令的標準錯誤重定向到一個文件,並且 bash 提示符被重定向。但是當我列印文件的內容時,它是空的。bash 提示符去哪兒了?
再次,當我將 bash 的標準輸出重定向到文件時,它重定向了輸出,而不是預期的提示,但是在列印文件內容時,提示中也有一些字元。如何?
的價值 $ PS1 and $ 提示命令:
請向我解釋一下。
在第一個中,如果 stderr 在啟動時連接到文件,我認為 Bash 會進入非互動模式。在該模式下,它取消
PS1
設置,因此不列印提示。它也顯示在 中$-
,它不包含i
表示互動模式。$ bash 2> file.txt echo ${PS1-unset} unset echo $- hBs
好吧,手冊頁也這麼說:
互動式 shell 是在沒有非選項參數(除非
-s
指定)和沒有-c
選項的情況下啟動的*,其標準輸入和錯誤都連接到終端*(由 確定isatty(3)
),或者以-i
選項啟動。PS1
如果 bash 是互動式的,則設置並$-
包含i
,允許 shell 腳本或啟動文件測試此狀態。但是,如果您在 shell 啟動後重定向 stderr,您會在文件中看到提示。以及您編寫的任何輸入:
main$ PS1='\$ ' bash $ exec 2> file.txt hello ^D main$ cat file.txt $ echo hello $ exit
在第二種情況下,反色的 ^G 提示終端鈴聲控製字元,用於結束在例如 xterm 中設置終端視窗標題的轉義序列。可能您的提示包含類似的內容,您可以使案例如
printf "%q\n" "$PS1"
查看帶有反斜杠編碼的特殊字元的提示。Debian
/etc/bash.bashrc
包含這個帶有標題轉義的部分:# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default. # If this is an xterm set the title to user@host:dir #case "$TERM" in #xterm*|rxvt*) # PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"' ...
它在
PROMPT_COMMAND
而不是提示本身,但想法是一樣的。\033]0;
和之間的部分\007
是標題的設置。