bash: [[ -t 1 ]] 是做什麼用的?判斷 interactive shell?



前言

  • 偶而會在一些 shell script 裡面看到 [[ -t 1]] 的判斷,究竟要判斷什麼?

  • 參考:Bash Test Operators




說明

interactive shell?

1
2
3
if [[ -t 1 ]]; then
  exec zsh
fi
  • -t 後面的 1 指的是:file descriptor,也就是確認現在執行的環境是否連接一個 terminal (= tty,text input/output environment)[1]。

  • 主要的目的是判斷「是不是 interactive 的環境」,方便後續作業。例如如果是 terminal,代表 output 需要呈現友善一點 (頗有可能是人在讀);如果只是要執行一個背景 shell script 作業,就不用 (太多) output 呈現在螢幕或 log 上 [2]。

但這是不精準的方法。


判斷 interactive shell 的正確方式

  • $- 確認目前 shell 的設定 [3],如果有 i 參數才代表真的是 interactive:
1
2
3
4
case $- in
  *i*) echo this shell is interactive;;
  *) echo this shell is not interactive;;
esac

可以在自己的 terminal 試試看

echo $-
    
# himBH

就能得到目前 shell 的設定。

himBH 的意思 [3]:




REF


主題 StackJimmy 設計