対話型ログインシェルの$ 0が-bashではないのはなぜですか?

対話型ログインシェルの$ 0が-bashではないのはなぜですか?

bashは対話型および対話型ログインについて読んでいましたが、オプションで-lbashを実行するとログインシェルで始まりますが、そうした後もecho $0確認のためにコマンドを実行するとまだログインしていないシェルとして表示されます。

[root@localhost ~]# bash -l
[root@localhost ~]# echo $0
bash

-これはシェル名の接頭辞として表示する必要があります。私が間違っている場合は確認してください。

答え1

-コマンド名の最初の文字としてanを使用することは、ログインシェルにシグナルを送信する唯一の方法であり、他のシグナルもあります。実際、現在のシェルがログインシェルかどうかを検出する正しい方法は、シェル自体に尋ねることです。

Bashのマニュアルから:

ログインシェルの引数を持たない最初の文字は、-または--loginオプションで始まります。

バッシュから:

shopt -p login_shell

-uシェルがログインしていない場合は印刷されます-s

テストしてみましょう:

$ ln -s $(which bash) ./-bash       # make a local copy of bash
$ PATH=$PATH:.                      # Big security problem, don't use it.
$ -bash                             # start the local copy of bash
$ echo $0                           # Its name start with an -
-bash                               
$ shopt -p login_shell              # Is it a login shell?
shopt -s login_shell                # Yes!, the answer is -s

$ exit                              # leave the login shell
$ PATH=${PATH%:.}                   # Remove the local pwd from the path.
$ rm ./-bash                        # Remove the local copy of bash

$ 0に-があるという事実は、必ずしもそのシェルがログインシェルであることを意味するわけではありません。

$  bash -c 'echo $0; shopt -p login_shell' -bash 1 2 3
-bash
shopt -u login_shell

マニュアルからログインシェルを取得する別の方法は、要求することです。

$ bash --login                 # ask for a login shell
$ echo $0                      # What is its name?
bash
$ shopt -p login_shell         # Is it a login shell?
shopt -s login_shell           # Yes, it is!

$ exit                         # leave the login shell.

答え2

ログインシェルは、次の2つのうちの1つです。
1-引数0の最初の文字は「-」です。
2- --login オプションで呼び出されます。

> echo $0
=if=> -bash # login shell.
=if=> bash  # we don't know nothing!!!
> shopt -p login_shell
=if=> shopt -s login_shell # login shell.
=if=> shopt -u login_shell # non-login shell

もう一つの方法(これは醜い方法です!)は、現在のシェルで終了することです。シェルがログインしている場合は出力がログアウトされ、それ以外の場合は終了します。

> bash
> shopt -p login_shell
shopt -u login_shell
> exit
exit # it says exit

> bash -l
> shopt -p login_shell
shopt -s login_shell
> exit
logout # it says logout

logout非ログインシェルではこれを行うことはできません。

関連情報