この2つのbashrcインタラクションチェックの違いは何ですか? [コピー]

この2つのbashrcインタラクションチェックの違いは何ですか? [コピー]

(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~/.bashrcbashがインタラクティブシェルで始まらない場合は、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方法が最も信頼性が高く移植性に優れているため、他の方法を使用する理由はありません。

関連情報