Rozumím základnímu rozdílu mezi interaktivním a neinteraktivním shellem. Ale co přesně odlišuje přihlašovací shell od nepřihlašovacího shellu?
Můžete uvést příklady použití interaktivity bez přihlášení shell?
Přijatá odpověď:
Přihlašovací shell je první proces, který se spustí pod vaším ID uživatele, když se přihlásíte do interaktivní relace. Proces přihlášení říká shellu, aby se choval jako přihlašovací shell s konvencí:předáním argumentu 0, což je normálně název spustitelného souboru shellu, s -
znak předřazený (např. -bash
zatímco normálně by to byl bash
. Přihlašovací shelly obvykle čtou soubor, který dělá věci, jako je nastavení proměnných prostředí:/etc/profile
a ~/.profile
pro tradiční Bourne shell, ~/.bash_profile
navíc pro bash, /etc/zprofile
a ~/.zprofile
pro zsh, /etc/csh.login
a ~/.login
pro csh atd.
Když se přihlásíte na textové konzoli nebo přes SSH nebo pomocí su -
, získáte interaktivní přihlášení skořápka. Když se přihlásíte v grafickém režimu (ve správci zobrazení X), nezískáte přihlašovací shell, místo toho získáte správce relace nebo správce oken.
Je vzácné spustit neinteraktivní přihlášení shell, ale některá nastavení X to dělají, když se přihlásíte pomocí správce zobrazení, aby bylo možné zařídit čtení souborů profilu. Další nastavení (závisí na distribuci a správci zobrazení) si přečtěte /etc/profile
a ~/.profile
výslovně, nebo je nečtěte. Dalším způsobem, jak získat neinteraktivní přihlašovací shell, je vzdálené přihlášení pomocí příkazu procházejícího přes standardní vstup, který není terminálem, např. ssh example.com <my-script-which-is-stored-locally
(na rozdíl od ssh example.com my-script-which-is-on-the-remote-machine
, který spouští neinteraktivní shell bez přihlášení).
Když spustíte shell v terminálu v existující relaci (obrazovka, X terminál, vyrovnávací paměť terminálu Emacs, shell uvnitř jiného atd.), získáte interaktivní, nepřihlašovací skořápka. Tento shell může číst konfigurační soubor shellu (~/.bashrc
pro bash vyvolaný jako bash
, /etc/zshrc
a ~/.zshrc
pro zsh, /etc/csh.cshrc
a ~/.cshrc
pro csh, soubor označený ENV
proměnná pro shelly kompatibilní s POSIX/XSI, jako je dash, ksh a bash, když je vyvolána jako sh
, $ENV
pokud je nastaveno a ~/.mkshrc
pro mksh atd.).
Když shell spustí skript nebo příkaz předaný na jeho příkazovém řádku, je to neinteraktivní, bez přihlášení skořápka. Takové shelly běží neustále:je velmi běžné, že když program volá jiný program, skutečně spustí malý skript v shellu, aby vyvolal tento jiný program. Některé shelly v tomto případě čtou spouštěcí soubor (bash spustí soubor označený BASH_ENV
proměnnou, zsh spustí /etc/zshenv
a ~/.zshenv
), ale to je riskantní:shell lze vyvolat v nejrůznějších kontextech a sotva můžete udělat něco, co by něco nerozbilo.
Trochu zjednodušuji, krvavé podrobnosti naleznete v příručce.