如何在 bash 中檢查 shell 是否以互動模式運作?

如何在 bash 中檢查 shell 是否以互動模式運作?

我如何判斷(在~/.bashrc)我是否在交互模式下運行,或者透過 ssh 執行命令。.bashrc如果是後者,我想避免列印 ANSI 轉義序列。

答案1

根據man bash

如果 bash 是互動式的,則設定 PS1 且 $- 包括 i,從而允許 shell 腳本或啟動檔案測試此狀態。

所以你可以使用:

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

也:

當啟動非登入 shell 的互動式 shell 時,bash 會從 /etc/bash.bashrc 和 ~/.bashrc 讀取並執行命令(如果這些檔案存在)。

所以~/.bashrc僅是互動式 shell 的來源。有時,人們會從不正確的來源獲取它,~/.bash_profile因為~/.profile它會幹擾預期的行為。如果您想簡化通用程式碼的維護,則應使用單獨的檔案來包含通用程式碼,並獨立於兩個 rc 檔案來取得它。

最好是沒有從登入rc檔案(例如~/.bash_profile或 )輸出到標準輸出~/.profile,因為它可能會幹擾rsync例如 的正確操作。

無論如何,測試互動性仍然是一個好主意,因為可能存在不正確的配置。

答案2

test工具可以檢查這一點(從手冊頁):

 -t FD          True if FD is opened on a terminal.

所以你可以使用例如:

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

或者

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

答案3

使用:

if tty -s; then echo interactive; fi

答案4

這就是紅帽的做法...猜測這是最快的方法...

if [ "${-#*i}" == "$-" ]; then

這意味著獲取 bash 參數,刪除子字串,盡可能短,匹配開頭和 i 之間的所有內容。然後檢查是否與原來的bash參數相同。

檢查您是否透過使用 sftp 連線到使用者來完成工作,如果非互動式會話有輸出,則會失敗

相關內容