man bash
言う、
A login shell is one whose first character of argument zero is a -, or
one started with the --login option.
Cygwinなどのターミナルを起動すると、 $0 からmintty -
1 つのハイフン ( ) が表示されます。-
$ echo $0
-bash
しかし、オプション付きでログインシェルを呼び出すと--login
、 は表示されません-
。
$bash --login
$echo $0
bash
私の質問は次のとおりです:
の役割は何ですか
-
? 呼び出されたログインシェルでは見ることができませんが--login
、 のような関連するシェルオプションを照会するだけでシェルの種類を確認できますshopt -q login_shell
。 それは何のためにあるのですか?に重要な役割があるのなら
-
、 で呼び出されたログインシェルでそれが表示されないのはなぜでしょうか--login
?ゼロ引数が で始まるログインシェルを手動で呼び出すにはどうすればよいですか
-
?zsh、csh などの他のシェルでも同様でしょうか?
答え1
プロセス名 (正確には ) の先頭のダッシュは、シェル (またはそれと同等のもの) をargv[0]
呼び出すプロセスによって配置されます。これは、シェル プログラムにログイン シェルとして動作するように指示します ( などを読み取る)。シェル プログラムは、他の状況ではログイン シェルとして動作することを選択できます (たとえば、bash と zsh は、コマンド ライン オプションが渡された場合、ログイン シェルとして動作します)。login
.profile
-l
ご質問にお答えします:
- の役割は、
-
シェルにログイン シェルとして動作するように指示することです。bash の場合、--login
コマンド ラインを渡すことは同等です。 - あなたは見ることができますの役割
-
bash が オプション付きで呼び出されると--login
、 と表示されます。bash が として呼び出されなかったため、 ではなくとして呼び出されたかどうか~/.profile
はわかりません。-bash
bash --login
-bash
-bash
- 一般的なシェルでは、0 番目の引数は選択できません。コマンド名にする必要があります。zsh では、
ARGV0=-bash bash
と を で実行できますksh93
。bash
またはではzsh
、 を実行できます。または では、 を実行できます。全体がで始まる必要があるため、 のようなことはできません。 を実行することもできますが、の前にが追加されるという厄介な副作用があります。(exec -a -bash bash)
mksh
zsh
hash -- -bash=/bin/bash; -bash
ln -s /bin/bash ./-bash; ./-bash
argv[0]
-
PATH=:$PATH; -bash
""
$PATH
- はい。
答え2
質問1と2
あなたの質問で述べられていることとは別にman bash
、マニュアルページにはこう書いてあるまたはログイン シェルを起動するには 2 つの方法があります。
- 引数 0 の最初の文字は a です
-
。 - --login オプションで開始しました。
2つの方法は互いに独立しています。引数0の最初の文字が-
しなければならないログイン シェルになることはできません。ただし、引数 0 の最初の文字が でないシェルは、-
ログイン シェルになることも、そうでないこともできます。 で呼び出された場合は、ログイン シェルになります--login
。
ログインシェルを確認する別の方法:
$ cuonglm at ~
$ bash --login
$ cuonglm at ~
$ grep -- -l /proc/$$/cmdline
Binary file /proc/7620/cmdline matches
質問3
簡単な方法:
$ cuonglm at ~
$ sudo su -
% root at ~
% shopt -q login_shell && echo "Login shell" || echo "Not login shell"
Login shell
質問4
zsh
私の知る限り、この場合もcsh
同様です。bash