Qual è la differenza tra i termini "Shell" e "Bash"?


11

Qual è la differenza tra "Shell" e "Bash" e cosa significano questi termini?

Per quanto ne so, non c'è differenza. Ma ho visto molti libri su "Shell" e altri su "Bash"!

Quindi, nel caso in cui volessi lavorare con il Terminale su Mac OS X e scrivere alcuni script bash, mi chiedo che tipo di libri dovrei cercare.


7
È una distinzione tra classe e istanza.
Kaz,

1
Materiale di lettura interessante: unix.stackexchange.com/questions/4126/…
Bernhard

1
la prima shell è stata scritta da un ragazzo chiamato Bourne. BASH è l'acronimo di "Boune Again Shell". È importante divertirsi!
Kinjal Dixit,

Risposte:


31

Una " shell " è qualsiasi software che fornisce un'interfaccia a un sistema operativo. Ad esempio, explorer.exe è la shell predefinita in Windows (anche se esistono alternative ) e su OS X Finder offre molte delle stesse funzionalità. Su Linux / * nix, la shell potrebbe far parte dell'ambiente desktop (come Gnome o KDE ), oppure può essere un componente software separato sopra di esso (come Unity o Cinnamon ).

Gli esempi sopra riportati sono tutte le shell grafiche che usano una combinazione di finestre, menu, icone e altri elementi simili per fornire un'interfaccia utente grafica (GUI) con cui è possibile interagire usando il cursore del mouse. Tuttavia, nel contesto di software come Bash, o scrittura di script, "shell" viene generalmente inteso come un interprete della riga di comando, che svolge in gran parte le stesse funzioni di una shell grafica, tranne che è interamente basato su testo.

Bash è un esempio specifico di shell da riga di comando ed è probabilmente uno dei più noti, essendo il default in molte distribuzioni Linux e OS X. È stato progettato come sostituto della shell Bourne (Bash sta per "Bourne again shell"), una delle prime shell Unix .

Esempi di shell della riga di comando su Windows includono cmd.exe (aka Prompt dei comandi) e PowerShell .


3
Il Finder di solito non è chiamato shell su OS X. La maggior parte delle funzionalità della GUI e della gestione delle finestre sono gestite da altri processi.
Lri,

1
@LauriRanta Wikipedia sembra non essere d'accordo . Indipendentemente dal fatto che abbia o meno l'aiuto di altri processi, il suo compito è consentire all'utente di interagire con il sistema operativo sottostante attraverso una GUI, e quindi si adatta alla descrizione di una shell grafica.
Indrek,

1
Immagino che il termine shell grafica possa applicarsi anche alle applicazioni di gestione dei file. Ma non è generalmente utilizzato su OS X e Finder è più simile a Nautilus rispetto alla shell di Windows o Unity.
Lri,

6
@LauriRanta: rapido quiz, qual è l'icona di Nautilus?
Lie Ryan,

2
@LauriRanta Dock non sarebbe un candidato migliore per una shell? Avvio di programmi e apertura di documenti, Expose / Spaces / Mission Control, AFAIK Launchpad e il selettore di attività sono tutte caratteristiche del Dock.
Daniel Beck

13

Bash è una delle numerose conchiglie.

Una shell su un sistema Unix o simile a Unix come OSX o Linux è un programma applicativo che fornisce un'interfaccia da riga di comando al sistema operativo, che consente di digitare comandi ed eseguirli. Esistono diverse shell tra cui scegliere, ma tutte forniscono il jolly dei nomi dei file, il piping, qui i documenti, la sostituzione dei comandi, le variabili e le strutture di controllo per il testing delle condizioni e l'iterazione.

La shell Unix originale era la shell Bourne , sh, scritta da Stephen Bourne alla Bell Labs. Poi è arrivata la shell C , scritta da Bill Joy a Berkeley, da allora aggiornata come tcsh . Altre shell includono la shell Korn , ksh, scritta da David Korn, anche a Bell Labs, e bash , la "Bourne again shell", scritta da Brian Fox per il progetto GNU in sostituzione gratuita di sh.

Oggi, bash è probabilmente la shell Unix più popolare, ma molte persone (me incluso) preferiscono ancora la shell C in base a (come ad alcuni di noi sembra) la sua sintassi migliore. Fondamentalmente, è una questione di gusti, quindi ti consiglio di leggere gli articoli di Wikipedia che ho collegato per aiutarti a iniziare.


2
Le shell non sono necessariamente basate sulla riga di comando, ci sono anche molte shell grafiche, ad esempio Nautilus, Windows Explorer, Finder, ecc. Il punto essenziale per la shell è che è un wrapper / interfaccia utente / shell attorno alle funzionalità del sistema operativo principale / chiamate di sistema, ie shells fornisce la gestione delle risorse (ad esempio la gestione dei file) e la gestione dei processi.
Lie Ryan,

1
@LieRyan quelli non sono shell, sono file manager. Le shell consentono l'esecuzione all'interno di essi di interpreti di comandi / script integrati. Vedi la mia risposta Solo essere in grado di eseguire un programma da un file manager non lo rende una shell.
Bill Rosmus,

@BillR: dovresti informare i ragazzi di Gnome Shell della tua definizione.
paradroid,

2
Sono propenso a concordare con Lie Ryan e paradroid, che le conchiglie grafiche sono ora considerate conchiglie. Sono investito nel paradigma della riga di comando come chiunque altro e ho resistito all'accettazione di shell grafiche come shell negli anni '90. Ma con tutti i widget del pannello di controllo e quant'altro in una moderna shell grafica, ora sono d'accordo che l'uso comune è chiamarli shell e che l'uso è corretto. Corrispondono alla definizione di shell, un livello di interfaccia utente relativamente sottile attorno al sistema operativo sottostante. Le shell grafiche sono più deboli su come chiunque scriverà qualcosa, ma molti utenti non se ne preoccupano.
Nicole Hamilton,

6

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.


2

Shell è un'interfaccia utente basata su testo.

Bash è un tipo di shell.


2
Che cos'è una "interfaccia utente basata su test"? Inoltre sarebbe bello espandere un po 'la tua risposta .. Come puoi vedere dalle altre risposte, aiuta sempre a dare più contesto.
slhck,

Scusa. Interfaccia utente basata su testo. Come vorresti che me lo spiegassi? Una shell è il modo in cui la riga di comando interagisce con il kernel del sistema operativo. Shell interpreta i tuoi comandi e li inoltra alla macchina che quindi, a sua volta, esegue le operazioni necessarie relative al comando che hai dato? Senza un manuale di 500 pagine è difficile spiegare efficacemente questa ambigua domanda. Lo sforzo della risposta si adatta allo sforzo della domanda. Questa domanda è dalle mele alle arance.
HayekSplosives,

Se pensi che una domanda mostri ora uno sforzo che non significa automaticamente che non dovresti impegnarti in una risposta. La tua risposta, rispetto alle altre, manca di qualche dettaglio. Ovviamente spetta a te aggiungerlo.
slhck,

Apprezzo la correzione e la lezione sulla responsabilità personale. Grazie per proteggere coloro che non sono disposti a impegnarsi da coloro che lo fanno. Sono totalmente fuori linea dimenticando quanto dovevo il poster.
HayekSplosives,


1

bash è una delle tante conchiglie esistenti.

Tutte le conchiglie hanno le loro somiglianze e differenze. Ad esempio uno script scritto in bash, potrebbe essere pienamente o ampiamente compatibile con un'altra shell (ad esempio zsh ).

A causa del fatto che bashè molto diffuso, spesso è implicito che uno script sia compatibile con esso.

Se stai cercando di acquistare un libro, acquistane uno scritto appositamente per la shell che intendi utilizzare. Sarebbe una buona idea leggere le loro differenze prima di spendere soldi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.