(Debian シェル) には次のものがあります.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
他の(Debianシェル)には次のものがあります。
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
それらの違いは何ですか?今どれを選ぶべきですか?
答え1
i
特殊パラメータの test for は、$-
現在のシェルが対話型シェルで始まるかどうかをテストします。
$PS1
(デフォルトのプロンプト文字列)が空である(ほとんどの場合)テストは、次の理由で予期しないシェルの相互作用を検出するためにbashシェル(およびそのシェルのみ)で使用することもできます。
$PS1
~/.bashrc
bashがインタラクティブシェルで始まらない場合は、bashがまだ読み込んでいても(たとえば、デフォルト以外の一部のbashバージョンからソースを再起動ssh
または明示的にインポートするときなど)、環境でaを無視します。~/.bashrc
$PS1
対話型呼び出しでは、環境にない場合にbash
設定されます。$PS1
"\s-\v\$ "
したがって、通常はbash
対話$PS1
型のときに設定され、非対話型の場合は設定されません。
$BASH_ENV
ただし、設定されたファイルがある場合$PS1
($BASH_ENV
非対話型呼び出しでもファイルが解釈されるため)、$PS1
環境にnull値がある場合、または~/.bashrc
非対話型シェルから取得された場合、この核は失敗します。設定しました。PS1
理由またはその他(たとえば、/etc/profile
非対話型ログインシェルを介して)、これらすべては実際には不可能です。
Kornに似たシェル(ksh88、ksh93、pdksh、mksh、oksh、bash、zsh...)では[[ $- = *i* ]]
orを実行することもできます[[ -o interactive ]]
(後者は該当しませんbash
)。
ただし、このcase $- in (*i*)...; esac
方法が最も信頼性が高く移植性に優れているため、他の方法を使用する理由はありません。