POSIXシェルスクリプトがインタラクティブに実行されていることを確認したいのですが、何らかの理由で次の機能が実行されていることを確認したいと思います。
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
答え1
シェルスクリプトは、インタラクティブシェルで起動しない限り、インタラクティブシェル環境ではほとんど実行されません。これは$-
含まれないことを意味しますi
。
あなたは何ですかできるチェックの目的は、標準入力が端末に接続されていることを確認することです。これは-t
、引数(標準入力ストリームのファイル記述子)を含む0
テストを使用して行われます。
running_interactively () { [ -t 0 ]; }
これは、「対話的に実行」が「端末から直接入力を読み取ることができる」ことを意味すると仮定する。
スクリプト内の完全なユーザー対話テストでは、ファイル記述子2(標準エラー)に対して追加のテストを実行できます。ユーザーの対話は、主に標準入力(ユーザー入力)と標準エラー(プロンプト、診断メッセージなど)で発生します。
running_interactively () { [ -t 0 ] && [ -t 2 ]; }
ただし、スクリプトの出力がリダイレクトまたはパイプされている場合、ファイル記述子1(標準出力)のテストは失敗します。