非対話型ログインシェルを使用できますか?

非対話型ログインシェルを使用できますか?

通訳するこのフローチャート

ここに画像の説明を入力してください。

私は man bash で以下を見つけました。

bashが--loginオプションを使用して対話型ログインシェルまたは非対話型シェルとして呼び出されると、まず/ etc / profileファイル(ファイルがある場合)からコマンドを読み取り、実行します。

これは次のことを示します。対話型ログインシェルを読む/etc/profile(--noprofileを除く)

返品、非対話型オプション--loginの読み取りを含むシェル/etc/profile

これはいくつかの可能性を残したようです。ログインシェル($0で始まる-非対話型(おそらくこのような単純なスクリプトを実行するとdate)(source)を読み取ることができない可能性があります/etc/profile

アイデアを確認または拒否します。

su -l -最初にaを最初の文字としてログインシェルを起動することを試しましたが、-それを非対話型にすることに失敗しました(そしてそれを検出するテストを提供できました)。

次のように電話してください。

$ bash -c 'date' -bash

ログインシェルとして報告されません(最初の文字がある場合でも-)。

詳細を確認するには、以下を試してください。

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

の最初の文字は$0aです。これは値に-(対話式で)存在しませんが、a(-u)として報告されません。この場合、/etc/profileは読み込まれませんが、これが正しいテストであるかどうかはわかりません。i$-login_shell


また、「珍しい非対話型ログインシェル」も言及されています。この回答ではこの質問については具体的ではありません。


これこの人の結論常に読み込まれます/etc/profile

要約表をお読みください。対話型および非対話型ログインシェルの両方を読み取ります。/etc/profile


そして、このページの例正しい:

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh [email protected]      # interactive login shell, `~/.profile`
$ ssh [email protected] env  # non-interactive non-login shell, `~/.bashrc`

exec su - bob -c 'env'読んだレポートをテストします/etc/profile


簡単に言うと:

持てますか?非対話型ログインシェル(--loginまたは-lなしで呼び出されます)?

/etc/profiletrueの場合、ファイルを読んでいますか?

上記が本当なら、次のように結論を下さなければなりません。みんなログインシェル[対話型(または非対話型)]は/ etc / profileを読み込みます(--noprofileオプションなし)。

注:/ etc / profileを読んでいることを確認するには、ファイルの先頭に次のコマンドを追加します。

echo "'/etc/profile' is being read"

ベストアンサー1

グラフィカルログイン環境が次のことを見てきました。

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

または均等に:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

~/.profileBourneに似たシェル(および一部のシェルの対応するファイル)にあるものなどのセッション初期化ファイルを読み込み、適用します。/etc

最初はすべてのシェルでは機能しません。-l複数のシェルでサポートされていますが、すべてではなく、一部のシェル(例:csh/)tcshでは機能しません-c。ただし、すべてのシェルはログインシェルであることをシェルに通知するために使用されるため、argv[0]存在する最初の文字を理解します。-login

2番目のケースでは、シェルのstdinはデバイスtty<<一時的な汎用ファイルまたはシェル依存パイプとして実装されている)ではないため、シェルは対話型ではありません(対話型の定義は人が対話するときです)。

おすすめ記事