Bash

我可以使用 if 語句來檢測 bash 和 dash 是否以互動方式執行嗎?

  • February 4, 2014

環顧了一會後,我發現了幾個很好的頁面,這些頁面描述瞭如何檢查和查看 bash 腳本是否以互動方式執行,並且似乎有幾種方法,但是我一遍又一遍地看到其中一個是檢查$-變數的存在i表示它是互動式的。

我正在尋找一種方法來使用可以同時使用and的if語句(通常在 Ubuntu 系統上別名為),或者用更少的詞 “盡可能通用****的互動式測試”/bin/bash``/bin/sh``/bin/dash
if

因為bash似乎這些東西應該起作用:

案例陳述

case "$-" in
*i*)    echo This shell is interactive ;;
*)  echo This shell is not interactive ;;
esac

如果語句

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

$-顯然沒有設置在dash. 可能是因為$-應該是傳遞給腳本變數的標誌

最初是一個被 Bash 採用的 ksh 構造,不幸的是它在 Bash 腳本中似乎不能可靠地工作……

$$ for it’s intended purpose however $$…它的一個可能用途是讓腳本自測試它是否是互動式的。

那麼是否有一個(相對簡單的)if測試可以與bash和一起使用dash

還是我只是“做錯了”?

ps:我的印像是dash比 快bash,除非腳本需要“bash 特定”功能,否則最好將其設置為 hashbang#!/bin/sh並讓它使用系統預設 shell。我知道以上述方式檢查互動式 shell“特定於 bash”的,但認為沒有更通用的方式似乎很奇怪。在我正在處理的腳本中,我不需要任何其他特定於 bash 的功能。

檢查互動式終端的一種非常常見(如果不是完全萬無一失)的方法是檢查是否PS1已設置:

if [[ -z "$PS1" ]]; then
   echo "Probably run as a script."
else
   echo "Probably interactive."
fi

另一種選擇是檢查i選項$-

case "$-" in
  *i*)
      echo "Probably interactive"
      ;;
  *)
      echo "Probably scripted"
      ;;
esac

(又名和它的表親, )還有一個-t選項:test``[``[[

fd=0 # stdin
if [[ -t "$fd" ]]; then
   echo "Interactive"
else
   echo "Scripted"
fi

Linux 文件項目致敬

dash並且sh可能沒有[[[可用,因此您可能必須明確使用test,例如:

fd=0
if test -t "$fd"; then  # you might need /path/to/test
   echo "Interactive"
else
   echo "Scripted"
fi

因為test是它自己的二進製文件,所以我很確定使用test -t的任何東西都與 shell 無關。

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