Il termine "shell" è ben chiamato. È letteralmente una shell attorno all'O / S che consente all'utente di interagire con il computer. Quando è stato originariamente concepito, c'erano pochissime interfacce utente grafiche (senza finestre :(). Tutto è stato fatto sulla riga di comando. Ma anche la riga di comando aveva bisogno di un posto dove vivere. Viveva e continua a vivere in una shell .
In parole povere, affinché la riga di comando fosse utile aveva bisogno di istruzioni che potesse chiamare. Quindi i programmi sono stati creati per essere eseguiti all'interno della shell per essere utilizzati dalla riga di comando. I programmi erano raggruppati strettamente nei loro pacchetti e intendevano lavorare insieme. Includono programmi come "ls" e "grep", "ps", "sed", ecc. Includono anche comandi di reindirizzamento dei file come ">" e "<" e pipe ("|"). Ancora più importante includono anche costrutti di programmazione come operazioni condizionali (se, quindi, altrimenti, per i cicli, mentre i cicli, modi per controllare lo stato restituito quando si esegue un'istruzione (ad esempio se si esegue "ls", ha trovato qualcosa?), Cosa come quello). Queste sono le basi di script a riga di comando (shell) più complessi,
Quando qualcuno usa il termine 'Bash Shell' stanno parlando di un interprete della riga di comando chiamato 'Bash' che gira nella shell O / S. Potresti pensarlo come abbreviazione di "Bash Shell Interpreter". Ci sono altri interpreti come Bourne (Bash è un 'Bourne Shell nuova e migliorata ed è l'abbreviazione di Bourne Again Shell). C'è anche C-Shell, K-Shell (favorita da molti che scrivono script di shell complessi) e altre varianti GNU. Nel corso degli anni è diventato consuetudine fare riferimento al particolare interprete della riga di comando che si sta utilizzando come shell perché uno non può essere utilizzato senza l'altro. Ma la realtà è che sono diversi.
Sul motivo per cui sono correttamente conosciuti come interpreti della riga di comando e non come shell reale: è perché vivono nella shell e interpretano tutti i comandi come se fossero in esecuzione in un programma. E alla shell non importa quale interprete si esegue, purché soddisfi gli standard corretti.
E sul perché sono chiamati interpreti, è perché sono davvero interpreti. Anche se non stai eseguendo esplicitamente uno script (e uno script è in realtà solo un file di testo di comandi che crei in modo da poter eseguire gli stessi comandi più e più volte senza doverli digitare nuovamente). Ad esempio, prendi l'umile comando 'ls'. Quando lo esegui, restituisce un elenco di file. Ma come funziona è più importante per la tua domanda: in realtà funziona all'interno del contesto dell'interprete della riga di comando, anche se esegui semplicemente quello che sembra essere un semplice comando unico. Cioè, funziona come se fosse una dichiarazione in parte di un programma più grande. Funziona come se fosse in un file di script di script di shell senza essere effettivamente in un file di script di shell. Un file di script shell anonimo per così dire.
Tutto ciò che si esegue sulla riga di comando ha questo in comune (sia che si tratti di un singolo comando come 'ls' o di un file di script pieno di comandi, iteratori e istruzioni condizionali): tutto viene elaborato dall'interprete della riga di comando; sia esso Bash, C-Shell, K-Shell (impostazione predefinita su AIX btw).
Per vedere cosa intendo, crea una directory 'test':
mkdir test
Inseriscilo ed esegui i seguenti comandi
grep hello *
Riceverai una sorta di risposta come "nessun file o directory". Ora inserisci il comando
echo $?
($? dice, dimmi cosa hai trovato nel criptico computer.) Dovresti vederlo restituire un numero (dovrebbe essere) '2'. Questo è il codice di ritorno da grep che significa "nessun file o directory". Ora esegui quanto segue:
echo hello > hello.txt
grep hello *
echo $?
Vedrai il file 'hello.txt' restituito dal comando grep iniziale e ora dovresti vedere 'echo $?' restituisce il numero "0" che significa che ha effettivamente trovato qualcosa.
Anche se questi comandi apparentemente unici vengono eseguiti, l'interprete della riga di comando si comporta come se facessero parte di un programma più ampio e tiene traccia dei loro valori di ritorno. Ecco perché se si dimentica * alla fine del comando grep, non ritorna. È noto che l'affermazione è incompleta e prevede ulteriori input. Dopotutto si potrebbe presumibilmente chiedergli di grep i risultati di alcuni loop che è perfettamente legale scrivere ed eseguire sulla riga di comando.
La linea di fondo è che la shell è la shell e l'interprete (qualunque sia il nome di quello che usi, 'Bash', k-shell, ecc.) Sono diversi. Ma spesso sono usati in modo intercambiabile, perché in ogni dato istante sono completamente legati insieme.