TL; DR :
- Giriş kabuğu nerede tanımlanır? In
/etc/passwd.
- Are
sudo su/ sudo su -/ sudo -i/ sudo -saynı? Hayır, hepsi bir kabuk oluştururlar ama farklı ve farklı bağlamlarda.
- Ne yapar
$SHELL? Sadece varsayılan kabuğunuzu olduğu gibi söyleyin /etc/passwd.
Gerçek Cevap :
Her şeyden önce, shoptbash'a özgü olduğunu belirtmek önemlidir . Örneğin, ben mkshkabuk kullanıcıyı ve yok shoptgibi, kshdeğil.
Daha sonra, tam olarak neyi login_shelltemsil etmesi gerekiyor? Gönderen man bash:
login_shell
Kabuk , oturum açma kabuğu olarak başlatılırsa bu seçeneği ayarlar
Kilit nokta bu. sudo -i, daha önce okuduğunuz cevaptan bildiğiniz gibi, ilk girişin simülasyonunu yapmanız gerekiyor. Bu yüzden bu seçenek için shoptraporlar login_shell on. Bunu sudo -i, kabuğun yalnızca bir oturum açma işlemi sırasında görünmesi gereken dosyaları (etkileşimli kabuklar tarafından kaynaklanmayan) geçmeye zorladığını düşünün .
Diğer durumlarda, zaten bir kabuk örneği çalıştırıyorsunuzdur, bu yüzden başlangıçta giriş kabuğu olamaz ve seçeneklerin amacı farklıdır. sudo -ssadece $SHELL(varsayılan kabuğunuzu ayarlandığı gibi temsil eder /etc/passwd) değişkenini okur ve kök ayrıcalığı ile çalıştırır. Bu yapmakla eşdeğerdir sudo $SHELLya sudo mkshya sudo bash(eğer kullanım başına hangisi).
mkshKullanıcı olduğumdan bahsettiğimi hatırlıyor musunuz? Şuna bir bak:
$ 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
Gördüğünüz şey, benim koyduğum karakteristik istem ile sudo -skabuğuma atladı . Ve tabii ki, bu bir giriş eylemi olmadığından, kabuğun giriş dışı kabuk örneği olarak üretildiğini bildirecektir. Ancak benim durumumda, bunun bir giriş kabuğu örneği olmadığını görüyorsunuz , bu bir giriş kabuğu örneği olsaydı orada olurdu.bashmkshbash$-l
Son olarak, aynı fikir sudo suve için de geçerlidir sudo su -. Daha sonra bir oturum açma kabuğu örneği (yani, oturum açmak için gereken belirli dosyalar çalışır) ve birincisi yalnızca etkileşimli kabukları oluşturur (yani, oturum açma dosyaları çalışmaz).
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
Yani teknik olarak, shopt login_shellbir ilişkisi yoktur$SHELL yoktur. Bunu şu şekilde düşünün: amacı bash'ın nasıl çalıştığını göstermektir . $SHELLyalnızca ne atadığınızı yansıtması gerekiyor /etc/passwd.
Giriş kabuğu ile giriş yapma dışı kabuk arasındaki farka gelince, unix.stackexchange.com adresindeki saygın Gilles tarafından açıklanmıştır. bu cevapta .
Ek eğlence
İşte deneyebileceğiniz eğlenceli bir şey. Bildiğiniz gibi, bir oturum açma kabuğu çalışacaktır .profile(ve .bashrcUbuntu'nun .profile bunu yapmak üzere yapılandırıldığı için ), ancak giriş yapmayan cehennem sadece .bashrcdosyayı çalıştıracaktır . echoBu komutlardan hangisinin bir giriş kabuğu çalıştırdığını hangisinin çalışmadığını test edebiliriz ve iki satır beklerizecho için oturum açma dışı için yalnızca bir .
$ 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:~#
Uygun şekilde, iki çıkış hattı olanlar login_shellayarlanmış olacaktır on.
.profileveya eşdeğerleri gibi) yapan belirli bir şekilde başlatılan bir kabuk örneğidir ve 2. Bu giriş için bir giriş için başlaması gereken kabuk/etc/passwdveya eşdeğeri olarak tanımlanır .$SHELLikincisini içerir,shoptçıktılarınız öncekiyle ilgilenir. Tipik olarak, (2) 'deki kabuk girişte başlatıldığında, (1) için gereken spesifik şekilde başlatılır, dolayısıyla anlamların birleşmesi başlar.