対話型ログインシェルの$ 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.

おすすめ記事