対話型シェル、ログインシェル、バッチシェルの違いを理解したようです。詳しくは、次のリンクをご覧ください。
- 「ログイン」と「対話型」bashシェルの違いは何ですか(姉妹サイトから:サーバー障害)
- ログインシェルと非ログインシェルの違いは何ですか?
- 2.1:シェルタイプ:インタラクティブシェルとログインシェル(からZシェルユーザーガイド)
私の質問は、対話型、ログイン、またはバッチシェルを使用している場合は、コマンド/条件でどのようにテストしますか?
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_shell
shopt -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