Linux

將bash提示重定向到文件時的奇怪輸出

  • June 23, 2021

我將 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是標題的設置。

引用自:https://unix.stackexchange.com/questions/655502