シェルがログイン/対話型/配置であることを確認する方法

シェルがログイン/対話型/配置であることを確認する方法

対話型シェル、ログインシェル、バッチシェルの違いを理解したようです。詳しくは、次のリンクをご覧ください。

私の質問は、対話型、ログイン、またはバッチシェルを使用している場合は、コマンド/条件でどのようにテストしますか?

trueコマンドまたは条件(returnまたは)を探しているので、falseそれをifステートメントに入れることもできます。たとえば、

if [[ condition ]]
   echo "This is a login shell"
fi

答え1

bashタグにシェルがリストされていないため、シェルなどがあるとします。

対話型シェルにあることを確認するには、次の手順を実行します。

[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'

ログインシェルに存在することを確認するには:

shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'

「バッチ」とは「非対話型」を意味すると仮定するため、対話型シェルを確認するだけで十分です。

答え2

Bourneスタイルのシェルでは、このiオプションはシェルが対話型かどうかを示します。

case $- in
  *i*) echo "This shell is interactive";;
  *) echo "This is a script";;
esac

ログインシェルをテストするための移植可能で完全に安定した方法はありません。 Kshとzshが.Bashlに追加されました$-。移植可能なテストが:で始まる場合、呼び出し側は引数0にプレフィックス(通常は実行可能ファイルの名前またはパス)を追加するため、シェルは通常自分がログインシェルであることを認識します。これは、ログインシェル(たとえば)を呼び出すシェル固有の方法を検出できません。login_shellshopt -q login_shell$0--ash -l

答え3

魚の皮

fish他のユーザーがこのページを誤って見つけた場合の答えです。

if status --is-interactive
    # fish is interactive - that is, connected to a keyboard.
    # do stuff...
end

if status --is-login
    # fish is a login shell - that is, should perform login tasks such  as  setting  up PATH
    # do stuff...
end

echo "darn, I really wanted to have to use globs or at least a case statement"

魚のドキュメントを参照

答え4

別の方法は結果を確認することです。tty

if [ "`tty`" != "not a tty" ]; then

関連情報