我如何判斷(在~/.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 連線到使用者來完成工作,如果非互動式會話有輸出,則會失敗