Giriş Kabuğu ile Giriş Kabuğu Olmayan Fark?


318

Etkileşimli bir kabuk ile etkileşimli olmayan bir kabuk arasındaki temel farkı anlıyorum. Ancak bir giriş kabuğunu giriş yapmayan bir kabuğundan tam olarak ayıran nedir?

Giriş yapmayan etkileşimli bir kabuğun kullanımlarına örnekler verebilir misiniz ?


45
Bence bu soru daha iyi ifade ediliyor: " Giriş ve giriş olmayan mermileri ayırt etmek için neden / umursayalım?" Web'de Birçok yerde zaten bize neyi Her okumak hangi dosyaların başlangıç açısından farklar; ancak hiçbiri “neden” i tatmin edici ve inandırıcı bir şekilde yanıtlamıyor gibi görünmüyor. Örnek kullanım durumlarından birini kesinlikle istemediğiniz durumlarda veya diğer davranışlarda çok iyi olurdu.
Kal

2
@Kal Bu farklı bir soru olacaktır, çünkü burada cevap yok aslında. Düzenleme: Aslında, işte burada: Niçin giriş yapmayan bir kabuk üzerinde bir giriş kabuğu? .
Skippy le Grand Gourou,

Yanıtlar:


304

Oturum açma kabuğu, etkileşimli bir oturum için oturum açtığınızda kullanıcı kimliğiniz altında yürütülen ilk işlemdir. Giriş işlemi, kabuğa bir kural ile giriş kabuğu olarak davranmasını söyler: normalde çalıştırılabilir kabuğun adı olan 0 argümanını geçen, önceden belirlenmiş bir -karakterle (örneğin -bashnormalde olur bash. : ortam değişkenlerini ayarlama gibi şeyler /etc/profileve ~/.profilegeleneksel Bourne kabuğu için ~/.bash_profileayrıca bash için , /etc/zprofileve ~/.zprofilezsh için , /etc/csh.loginve ~/.logincsh için vs.

Bir metin konsolunda veya SSH üzerinden veya ile oturum açtığınızda, etkileşimli bir giriş kabuğu su -alırsınız . Grafik modunda giriş yaptığınızda (bir X ekran yöneticisinde ), bir giriş kabuğu alamazsınız, bunun yerine bir oturum yöneticisi veya bir pencere yöneticisi alırsınız.

Etkileşimli olmayan bir giriş kabuğu çalıştırmak nadirdir , ancak bazı X ayarları, bir görüntü yöneticisi ile oturum açtığınızda, profil dosyalarını okuyacak şekilde düzenler. Diğer ayarlar (bu, dağılıma ve ekran yöneticisine göre değişir) açıkça /etc/profileve ~/.profileaçık bir şekilde okuyun veya okumayın. Etkileşimli olmayan bir giriş kabuğu elde etmenin bir başka yolu, terminal olmayan standart bir girdiden geçen bir komutla uzaktan giriş yapmaktır, örneğin ssh example.com <my-script-which-is-stored-locally( ssh example.com my-script-which-is-on-the-remote-machineetkileşimli olmayan, giriş yapmayan bir kabuğu çalıştıran).

Varolan bir oturumdaki bir terminalde bir kabuk başlattığınızda (ekran, X terminali, Emacs terminal tamponu, başka bir içindeki kabuk, vb.), Etkileşimli, giriş yapmayan bir kabuk elde edersiniz . Bu kabuk (bir kabuk konfigürasyon dosyasını okumak olabilir ~/.bashrcBash olarak çağrılan için bash, /etc/zshrcve ~/.zshrczsh için, /etc/csh.cshrcve ~/.cshrccsh'ın, dosya ile gösterildiği ENVşekilde çağrıldığında bu çizgi, ksh ve dondurma olarak POSIX / XSI uyumlu kabuklar için değişken sh, $ENVset halinde ve ~/.mkshrcmksh, vb. için).

Bir kabuk komut dosyasını veya komut satırında geçen bir komutu çalıştırdığında, etkileşimli olmayan, giriş yapmayan bir kabuktur. Bu tür kabuklar her zaman çalışır: Bir program başka bir programı çağırdığında, gerçekten diğer programı çağırmak için bir kabuk içinde küçük bir komut dosyası çalıştırması çok yaygındır. Bazı mermiler bu durumda bir başlangıç ​​dosyasını okur (bash, BASH_ENVdeğişken tarafından belirtilen dosyayı çalıştırır , zsh çalıştırır /etc/zshenvve ~/.zshenv), ancak bu risklidir: kabuk her türlü bağlamda çağrılabilir ve yapamayacağınız hiçbir şey yoktur. bir şeyi kırmak.

Biraz basitleştiriyorum, kanlı ayrıntılar için kılavuza bakın.


2
bashEtkileşimli olmayan bir giriş kabuğu olarak nasıl çalıştırılacağına bir örnek verebilir misiniz ?
Piotr Dobrogost

13
@PiotrDobrogostecho $- | bash -lx
Gilles

1
Bunun genel olarak doğru olup olmadığını bilmiyorum, ancak yeni bir terminal açtığımda (varsayılan ayarları kullanarak osx'ta), kullanıcı adımı veya şifremi hiçbir zaman yazmasam bile bir giriş kabuğu alıyorum.
Kevin Wheeler,

4
@KevinWheeler OSX'te, varsayılan olarak, Terminal uygulaması bir giriş kabuğu çalıştırır. (Açıkladığım gibi, kabuğu başlatan program kabuğun bir giriş kabuğu gibi davranıp davranmayacağına karar verir.) Bu, işleri yapmanın normal bir yolu değildir.
Gilles,

2
@IAmJulianAcosta Bir FOOortam değişkeni ise (yani .profileiçeriyorsa export FOO=something), dahil olmak üzere tüm alt işlemlerde kullanılabilir foo.sh. Eğer değiştirirseniz .profileiçin export FOO=something_elsedaha sonra ./foo.shyine yazdırır somethingdahaki sefere kadar giriş.
Gilles

48

Bir giriş kabuğu olup olmadığını söylemek için:

prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.

prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.

Bash'de ayrıca şunları da kullanabilirsiniz shopt login_shell:

prompt> shopt login_shell
login_shell     off

(veya onbir giriş kabuğu).

Bilgi bulunabilir man bash(Çağırma için arama). İşte bir alıntı:

Bir oturum açma kabuğu, ilk argüman sıfırı bir - olan veya bir --login seçeneğiyle başlayan bir kabuktur.

Bunu kendin test edebilirsin. Ne zaman SSH, giriş kabuğu kullanıyorsun. Örneğin:

prompt> ssh user@localhost
user@localhost's password:
prompt> echo $0
-bash

Oturum açma kabuğu kullanmanın önemi, ayarların herhangi birinin /home/user/.bash_profileçalıştırılmasıdır. Eğer ilgileniyorsanız İşte biraz daha fazla bilgi (dan man bash)

"Bash etkileşimli bir giriş kabuğu olarak veya --login seçeneğiyle etkileşimli olmayan bir kabuk olarak çağrıldığında, önce bu dosya varsa / etc / profile dosyasındaki komutları okur ve çalıştırır. arar ~/.bash_profile, ~/.bash_loginve ~/.profile, bu sırayla ve okur ve var ve okunabilir. kabuk bu davranışı engellemek için başlatıldığında --noprofile seçeneği kullanılabilir ilkindeki komutları yürütür."


23

Bir giriş kabuğunda argv[0][0] == '-',. Giriş kabuğu olduğunu biliyor.

Ve sonra bazı durumlarda "giriş kabuğu" durumuna bağlı olarak farklı davranır. Örneğin, bir giriş kabuğu olmayan bir kabuk, "çıkış" komutunu çalıştırmaz.


4
Vurguya göre man bash, "Bir oturum açma kabuğu, ilk argüman sıfırı bir - - olan veya bir --login seçeneğiyle başlayan bir kabuktur . "
Wildcard

18

Bir GUI'deki yeni bir terminalde başlatılan bir kabuk, etkileşimli bir oturum açma olmayan kabuk olacaktır. Örneğin, .bashrc kaynağınız olurdu, fakat .profile öğenizi kaynaklamaz.


4

Gilles’un büyük yanıtını, Timothy’in giriş kabuğu türünü denetleme yöntemiyle birleştirerek açıklayacağım.

Kendiniz için bir şeyler görmek istiyorsanız, aşağıdaki snippet'leri ve senaryoları deneyin.

Kabuğun etkileşimli olup olmadığını kontrol etme

if tty -s; then echo 'This is interactive shell.'; else echo 'This is non-interactive shell.'; fi

Kabuğun (olmayan) giriş olup olmadığını kontrol etme

Çıktı ile echo $0başlarsa -, bu giriş kabuğu ( echo $0çıktı örneği :) -bash. Aksi halde giriş yapmayan kabuk ( echo $0çıktı örneği :) bash.

if echo $0 | grep -e ^\- 2>&1>/dev/null; then echo "This is login shell."; else echo "This is non-login shell."; fi;

Her iki bilgiyi aynı anda almak için yukarıdaki ikisini bir araya getirelim:

THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; 
THIS_SHELL_LOGIN_TYPE='non-login'; 
if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; 
if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

Senaryolar:

Özel seçeneksiz tipik SSH oturumu

ssh ubuntu@34.247.105.87
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

ubuntu@ip-172-31-0-70:~$ THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_LOGIN_TYPE='non-login';
ubuntu@ip-172-31-0-70:~$ if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
ubuntu@ip-172-31-0-70:~$ if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
ubuntu@ip-172-31-0-70:~$ echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

interactive/login

Betik çalıştırma veya açıkça yeni kabukla çalıştırma

ubuntu@ip-172-31-0-70:~$  bash -c 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; 
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

Yerel komut dosyasını uzaktan çalıştırma

ssh ubuntu@34.247.105.87 < checkmy.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

non-interactive/login

Uzaktan ssh üzerinden komut çalıştırma

ssh ubuntu@34.247.105.87 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

non-interactive/non-login

-tSwitch ile uzaktan ssh üzerinden komut çalıştırma

-tAnahtarını kullanarak uzaktan ssh ile komut çalıştırmak istediğinizde açıkça etkileşimli kabuk isteyebilirsiniz .

ssh ubuntu@34.247.105.87 -t 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

Not: Uzaktan çalıştırma komutunun neden buradalogin shell daha fazla bilgi olmadığı konusunda .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.