通訳で このフローチャート
私はそれを男のバッシュで見つけました:
Bashが対話型ログインシェルとして、または--loginオプションを使用して非対話型シェルとして呼び出されると、ファイル/ etc/profileが存在する場合、そのファイルからコマンドを読み取り、実行します。
これは、インタラクティブログインシェルが/etc/profile
(-noprofileなし)を読み取ることを示しています
また、non-interactiveshells with a option --login
read /etc/profile
loginシェル($0
が-
で始まるシェル)を残しているようです非インタラクティブ(スクリプトを実行します。多分date
のように単純です)は、(ソース)/etc/profile
を読み取れない場合があります。
このアイデアを確認または拒否するには:
最初にsu -l -
を使用しようとしました。これは、最初の文字として-
を使用してログインシェルを開始しますが、非対話型にすることはできません(そして、テストを提示してプローブすることができます)。
のようなものを呼び出す
$ 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
$0
の最初の文字は-
であり、$-
の値にi
(インタラクティブ)はありませんが、login_Shell
(-u)としては報告されません。この場合、/ etc/profileは読み取られませんでしたが、これが正しいテストであるかどうかはわかりません。
「まれな非対話型ログインシェル」についての言及もあります この回答では この質問に十分具体的ではありません。
この男の結論 は、/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で呼び出されない)を持つことは可能ですか?
そして、trueの場合、それは/etc/profile
ファイルを読み取っていますか?
上記が当てはまる場合、[〜#〜] all [〜#〜]ログインシェル[対話型(または非対話型)]読み取り/ etc/profile(--noprofile
オプションなし)。
注:/ etc/profileが読み取られていることを検出するには、ファイルの先頭に次のコマンドを追加するだけです。
echo "'/etc/profile' is being read"
非インタラクティブログインシェルは珍しいですが、可能です。 0番目の引数(通常は実行可能ファイルの名前)を-
で始まる文字列に設定してシェルを起動すると、対話型かどうかに関係なく、ログインシェルになります。
$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_Shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_Shell
hB
シェルがログインシェルであることを通知しないため、bash -c date -bash
は失敗しました。0番目の引数はbash
であり、-bash
ではありません。 bashが開始されると、変数$0
が0番目の引数ではなく-bash
に設定されますが、重要なのは0番目の引数です。
su -l
またはsu -
を使用して非対話型ログインシェルを実行できますが、認証されている間は標準入力が端末にならないようにする必要があります(パスワードを入力したり、パスワードを入力の最初に置くため)。 Sudoを使用すると簡単な場合があります。Sudo true
を実行してプレゼンス資格情報を取得してから、資格情報がまだ有効な間にecho 'shopt -p login_Shell; echo $-' | Sudo -i
を実行します。
次のようなグラフィカルログイン環境を見てきました。
exec "$Shell" -l -c 'exec start-window-or-session-manager'
または同等のもの:
exec -a "-$Shell" "$Shell" <<EOF
exec start-window-or-session-manager
EOF
そのため、セッション初期化ファイル(Bourneのようなシェルの~/.profile
など(一部の場合は/etc
の対応するもの)など)を読み取って適用します。
最初のものはすべてのシェルで動作するわけではありません。 -l
は多数のシェルでサポートされていますが、すべてではありません。また、csh
/tcsh
など、-c
では使用できないシェルもあります。 argv[0]
の最初の文字が-
であることは、すべてのシェルで認識されます。これは、login
がシェルにログインシェルであることを伝えるために使用されるためです。
2番目のケースでは、そのシェルのstdinはtty
デバイス以外のものです(<<
は一時的な通常のファイル、またはシェルに応じてパイプによって実装されます)。したがって、シェルはそうではありません。インタラクティブ(人間が対話するときのインタラクティブな存在の定義)。
はい、非対話型のログインシェルが可能です
$ head -1 /etc/profile
echo PROFILE BEING READ
$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello
$
非対話型ログインシェル(--loginまたは-lで呼び出されない)を持つことは可能ですか?
はい
$ (exec -a '-' bash -c 'shopt -q login_Shell && echo login Shell')
ただし、/etc/profile
引数を指定しない限り、--login
は非対話型ログインシェルには使用されないことに注意してください。
非対話型ログインシェルを呼び出す一般的なイディオムは次のとおりです。
$ su - someuser -c somecommand
しかし、これには/etc/profile
が実行されないという事実があります。
この動作を変更することは可能ですが、 config-top.h にあるオプションのコメントを解除することにより、コンパイル時にBashソースコードをカスタマイズする必要があります。
/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */
このsu
異常を調査した のとき、zsh
とdash
を含む他のシェルにはこの不一致がないことがわかりました。