2018年8月6日 星期一

bash: INVOCATION

login shell:選項有 -l 或 --login,或者指令名稱由「-」開頭,有登入 (或登出) 動作。

interactive shell:指令搭配 prompt 從標準輸入讀取,shell 需要支援一些互動所需要的動作。
  • 沒有非選項的引數,或有選項 -s。其標準輸入及錯誤輸出連接到 isatty() 決定的終端機。或者有選項 -i。不能有選項 -c 在引數指定指令。
  • 會設定 PS1 作為輸入指令的 prompt,且 $- 包含 i,讓 shell 指令檔或起始執行的檔案測試是否為 interactive。
接下來說明 bash 開始和結束時執行的檔案,如果檔案存在但無法讀取,bash 回報錯誤。檔名 tilde 擴展見 bash EXPANSION 的 Tilde Expansion。

當 bash 以名稱 sh 執行,會採用傳統 sh 的起始行為,並進入 posix 模式。

shelllogin
(不管是否為 interactive)
interactive
(不含 login)
非 interacitve
bashshbashshbashsh
啟始/etc/profile
~/.bash_profile
~/.bash_login
~/.profile 三者之一
/etc/profile
~/.profile
/etc/bash.bashrc
~/.bashrc
. "$ENV". "$BASH_ENV"
選項--noprofile --norc
--rcfile file
結束~/.bash_logout
bash 由 rshd 或 sshd 等 remote shell daemon 執行時,偵測標準輸入是否連到網路連線,使用 intreactive shell 的行為。

如果 shell 開始時 effective user (group) ID 跟 real user (group) ID 不同,啟始檔案不執行,且不自環境繼承 shell function,忽略變數 SHELLOPTS、BASHOPTS、CDPATH、和 GLOBIGNORE。此時選項 -p 沒設,effective user ID 設為 real user ID。

判定是否在互動模式

方式一:看 $- 是否有 i
case "$-" in
*i*) echo This shell is interactive ;;
*)   echo This shell is not interactive ;;
esac

方式二:PS1 有設

if [ -z "$PS1" ]; then
    echo This shell is not interactive
else
    echo This shell is interactive
fi

參考來源

man bash INVOCATION 節

延伸閱讀

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...