Shell-Script
對確定 shell 腳本是否以互動方式執行感到困惑
我只想從我的 POSIX shell 腳本中確定它是否以互動方式執行,但由於某種原因,以下函式:
running_interactively() { printf '%s' ${-} | grep -F i > /dev/null 2>&1 }
即使我在終端中執行腳本,也會返回 false。我做錯了嗎,還是互動式腳本的定義與我在終端中由使用者執行腳本的簡單想法有所不同?
程式碼片段:
#!/bin/sh set -u running_interactively() { # echo $- returns only u printf '%s' ${-} | grep i > /dev/null 2>&1 } print_error_and_exit() { # redirect all output from this function to standard error stream if running_interactively then exec >&2 else echo wrong again, smart ass fi ... } print_error_and_exit someArgs
shell 腳本,除非它是由互動式 shell 提供的,否則很少在互動式 shell 環境中執行。這意味著
$-
不會包含i
.您可以檢查的是標準輸入是否連接到終端。這是使用帶有(標準輸入流的文件描述符)
-t
參數的測試完成的:0
running_interactively () { [ -t 0 ]; }
這假設“以互動方式執行”是指“能夠直接從終端讀取輸入”。
對文件描述符 2(標準錯誤)的附加測試也可以作為能夠在腳本中與使用者進行完全互動的測試。使用者互動主要發生在標準輸入(使用者輸入)和標準錯誤(提示、診斷資訊等)上:
running_interactively () { [ -t 0 ] && [ -t 2 ]; }
但是,如果腳本的輸出被重定向或管道傳輸,則對文件描述符 1(標準輸出)的測試將失敗。