Sudo -i/-s
here の違いを読んでいた。コマンドshopt
を使用した後、all(Sudo su/Sudo -i/Sudo -s
)$Shell
は同じ結果を提供しますが、shopt
コマンドの結果は異なります。
それでは、ログインシェルと非ログインシェルはどのように定義されていますか?
どこからshopt
が結果を取得しますか?
なぜ$Shell
に関連しないのですか?
Sudo su
givinv@87-109:~$ Sudo su
root@87-109:/home/givinv#
root@87-109:/home/givinv#
root@87-109:/home/givinv# shopt -q login_Shell && echo 'Login Shell' || echo 'No login Shell'
No login Shell
root@87-109:/home/givinv# echo $Shell
/bin/bash
root@87-109:/home/givinv#
root@87-109:/home/givinv# exit
givinv@87-109:~$
Sudo -i
givinv@87-109:~$ Sudo -i
root@87-109:~#
root@87-109:~# shopt -q login_Shell && echo 'Login Shell' || echo 'No login Shell'
Login Shell
root@87-109:~# echo $Shell
/bin/bash
root@87-109:~#
Sudo -s
root@87-109:~# Sudo -s
root@87-109:~# shopt -q login_Shell && echo 'Login Shell' || echo 'No login Shell'
No login Shell
root@87-109:~# echo $Shell
/bin/bash
root@87-109:~#
TL; DR:
/etc/passwd
。Sudo su
/Sudo su -
/Sudo -i
/Sudo -s
は同じですか?いいえ、それらはすべてシェルを生成しますが、異なる方法および異なるコンテキストで生成されます。$Shell
は何をしますか? /etc/passwd
と同様に、デフォルトのシェルを指定してください。実際の回答:
まず、shopt
はbash固有であることに言及することが重要です。たとえば、私はmksh
シェルユーザーであり、shopt
にはないksh
とは異なり、shopt
もありません。
次に、login_Shell
が正確に表すものは何ですか? man bash
から:
login_Shell
ログインシェルとして起動された場合、シェルはこのオプションを設定します
それが重要なポイントです。 Sudo -i
は、あなたが読んだ以前の回答から既に知っているように、最初のログインをシミュレートすることになっています。そのため、このオプションについてmksh
がlogin_Shell on
を報告します。これは、Sudo -i
が、ログインプロセス中にのみ表示されるはずのファイル(対話型シェルからは取得されない)をシェルに強制的に移動させるかのように考えてください。
他の場合では、すでにシェルのインスタンスを実行しているため、そもそもログインシェルにすることはできず、オプションの目的は異なります。 Sudo -s
は、単に$Shell
(/etc/passwd
で設定されたデフォルトのシェルを表すことを意図しています)変数を読み取り、root権限で実行します。これは、Sudo $Shell
またはSudo mksh
またはSudo bash
(使用した方)を実行するのと同じです。
私はbash
ユーザーだと言ったことを覚えていますか?これを見てください:
$ bash --posix
bash-4.3$ Sudo -s
[Sudo] password for xieerqi:
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id
uid=0(root) gid=0(root) groups=0(root)
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU
表示されるのは、Sudo -s
がmksh
からbash
Shellにジャンプし、設定した特性プロンプトが表示されていることです。そしてもちろん、これはログインアクションではないので、l
に対しては、シェルが非ログインシェルインスタンスとして生成されたことを報告します。ただし、私の場合、$-
にはecho
という文字がありません。これはログインシェルインスタンスの場合に表示されます。
最後に、Sudo su
とSudo su -
にも同じ考え方が当てはまります。後でログインシェルインスタンスが生成され(つまり、ログインに必要な特定のファイルが実行されます)、前者は対話型シェルのみが生成されます(つまり、ログインファイルは実行されません)。
bash-4.3$ Sudo su
[Sudo] password for xieerqi:
root@eagle:/home/xieerqi# shopt login_Shell
login_Shell off
root@eagle:/home/xieerqi# exit
bash-4.3$ Sudo su -
[Sudo] password for xieerqi:
$ shopt login_Shell
login_Shell on
技術的には、shopt login_Shell
は$Shell
とは一切関係ありません。このように考えてください:その目的は、howbashの実行を示すことです。 $Shell
は、/etc/passwd
で割り当てたもののみを反映することになっています。
ログインシェルと非ログインシェルの違いについては、unix.stackexchange.comの尊敬されるジルが this answer で説明しています。
追加の楽しみ
あなたが試すことができる何か楽しいものがあります。既にご存知かもしれませんが、ログインシェルは.profile
(およびUbuntuの.bashrc
そうするように構成されている から.profile
を実行しますが、非ログインhellは実行します.bashrc
ファイルのみを実行します。したがって、echo
を使用して、これらのコマンドのうちログインシェルを実行するものと実行しないものをテストすることができます。
$ echo "echo 'hi,i am .profile'" >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ Sudo -i
hi, i am .bashrc
hi,i am .profile
$ Sudo su
hi, i am .bashrc
root@eagle:~# Sudo su -
hi, i am .bashrc
hi,i am .profile
$ Sudo -s
hi, i am .bashrc
root@eagle:~#
適切なことに、2行の出力がある場合は、login_Shell
がon
に設定されます。
@Sergが説明しているように、 このシェルで実行中のシェルを確認する方法について 、Shell
変数は現在のユーザーのdefaultShell /etc/passwd
から読み取った場合:
$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash
echo $Shell
の場合、常に/bin/bash
を返します:
$ zsh
% echo $Shell
/bin/bash
シェルがログインシェルであるかどうかは、shelloptシェルの起動時に決定されるイオン。シェルプログラムは、この情報を他のすべての設定と変数とともに保存します。 shopt
コマンドは、この情報を表示し、可能であれば問題のオプションについて設定または設定解除する方法を提供します(もちろん、これはlogin_Shell
には当てはまりません。シェルの起動に使用されるプロセス)
Sudo
プログラムのオプションは、これらのさまざまなタイプのルートシェルの起動方法を決定します。
man bash
:
ログインシェルは、引数ゼロの最初の文字が
-
であるシェル、または--login
オプションで開始されたシェルです。
man login
:
$HOME
、$Shell
[...]の値は、パスワードエントリの適切なフィールドに従って設定されます。
要するに:
$Shell
は、login
または呼び出しプログラムによって設定されます(例:su
)。シェル自体は設定しません。shopt
は、現在有効なシェルオプションを示します。