TL; DR :
- Di mana shell login didefinisikan? Dalam
/etc/passwd.
- Apakah
sudo su/ sudo su -/ sudo -i/ sudo -ssama? Tidak, mereka semua menghasilkan cangkang tetapi berbeda dan dalam konteks yang berbeda.
- Apa yang
$SHELLharus dilakukan Katakan saja shell default Anda, sama seperti di /etc/passwd.
Jawaban Aktual :
Pertama-tama, penting untuk menyebutkan bahwa shoptitu spesifik-bash. Sebagai contoh, saya mkshpengguna shell, dan tidak memiliki shopt, sama seperti kshtidak.
Selanjutnya, apa sebenarnya login_shellyang harus diwakili? Dari man bash:
login_shell
Shell menetapkan opsi ini jika dimulai sebagai shell login
Itulah poin kuncinya. sudo -i, seperti yang sudah Anda ketahui dari jawaban sebelumnya yang Anda baca, seharusnya mensimulasikan login awal. Itu sebabnya shoptlaporan login_shell on untuk opsi ini. Pikirkan ini seolah sudo -imemaksa shell untuk pergi melalui file yang seharusnya hanya muncul selama proses login (yang tidak bersumber dari shell interaktif).
Dalam kasus lain, Anda sudah menjalankan instance dari shell, jadi itu tidak bisa menjadi shell login di tempat pertama, dan tujuan dari opsi berbeda. sudo -shanya membaca $SHELL(yang dimaksudkan untuk mewakili shell default Anda sebagaimana diatur dalam /etc/passwd) variabel dan menjalankannya dengan hak akses root. Ini sama dengan melakukan sudo $SHELLatau sudo mkshatau sudo bash(mana pun yang Anda gunakan).
Ingat saya sebutkan bahwa saya mkshpengguna? Lihatlah ini:
$ 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
Apa yang Anda lihat adalah yang sudo -smelompat dari shell bashsaya mksh, dengan prompt karakteristik yang saya tetapkan untuk itu. Dan tentu saja, karena ini bukan tindakan masuk, karena bashakan melaporkan bahwa shell muncul sebagai contoh shell non-login. Dalam kasus saya, Anda melihat bahwa $-tidak lada surat di sana, yang akan ada di sana jika itu adalah contoh shell login.
Akhirnya, ide yang sama berlaku untuk sudo sudan sudo su -. Kemudian satu spawns instance shell login (yaitu, file spesifik yang diperlukan untuk login akan berjalan) dan yang pertama hanya memunculkan shell interaktif (yaitu, file login tidak berjalan).
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
Jadi secara teknis, shopt login_shelltidak ada hubungannya dengan $SHELLapa pun. Pikirkan seperti ini: tujuannya adalah untuk menunjukkan bagaimana bash berjalan. $SHELLseharusnya hanya mencerminkan apa yang telah Anda tetapkan /etc/passwd.
Adapun perbedaan antara shell login dan shell non-login, telah dijelaskan oleh Gilles yang sangat dihormati di unix.stackexchange.com dalam jawaban ini .
Menyenangkan tambahan
Inilah sesuatu yang menyenangkan yang bisa Anda coba. Seperti yang mungkin sudah Anda ketahui, shell login akan berjalan .profile(dan .bashrckarena Ubuntu .profile dikonfigurasikan untuk melakukannya ), tetapi neraka non-login hanya akan menjalankan .bashrcfile. Jadi kita dapat menguji dengan echoperintah mana yang menjalankan shell login dan mana yang tidak, dan kami mengharapkan dua baris echountuk shell login dan hanya satu untuk non-login.
$ 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:~#
Cukup tepat, mereka yang memiliki dua jalur output akan login_shelldiatur ke on.
.profileatau setara), dan 2. Shell yang seharusnya dimulai saat login untuk sebuah pengguna, sebagaimana didefinisikan dalam/etc/passwdatau setara.$SHELLberisi yang terakhir,shoptoutput Anda berurusan dengan yang pertama. Biasanya, ketika shell dalam (2) dimulai pada saat login, itu dimulai dengan cara khusus yang diperlukan untuk (1), maka dari itu pengubahan makna.