Bash
我可以使用 if 語句來檢測 bash 和 dash 是否以互動方式執行嗎?
環顧了一會後,我發現了幾個很好的頁面,這些頁面描述瞭如何檢查和查看 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
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 無關。