Differenza tra sh e bash


1305

Quando scriviamo programmi shell, usiamo spesso /bin/she /bin/bash. Di solito lo uso bash, ma non so quale sia la differenza tra di loro.

Qual è la differenza principale tra bashe sh?

Di cosa dobbiamo essere consapevoli quando programmiamo in bashe sh?


21
Per un utile elenco di bashismi e codice corrispondente che funziona sulla shell Bourne, vedere mywiki.wooledge.org/Bashism
StackExchange saddens dancek

1
Potresti voler vedere lo standard POSIX per sh e il suo linguaggio di comando: * sh * Shell Command Language
Maurício C Antunes

7
come regola generale, tutti gli script sh verranno eseguiti in bash grazie alla sua compatibilità con posix, ma non tutti gli script bash possono essere eseguiti in sh, le differenze principali che si notano sono cose come [[]] anziché [] confronti che consentono spazi non quotati, $ (()) anziché $ [] espressioni aritmetiche, e altre cose come "è troppo grande e troppo lento" direttamente dai documenti bash .. Ma i nuovi script non devono limitarsi a script sh-compatibili a meno che non stiano girando per alcuni compatibilità con le versioni precedenti, che il più delle volte non è il caso in questi giorni, dopo tutto è (o era ...) l'anno 2014 giusto ??
Osirisgothra,

Risposte:


1142

Che cos'è sh

sh(o Shell Command Language) è un linguaggio di programmazione descritto dallo standard POSIX . Ha molte implementazioni ( ksh88, dash, ...). bashpuò anche essere considerata un'implementazione di sh(vedi sotto).

Perché shè una specifica, non un'implementazione, /bin/shè un collegamento simbolico (o un collegamento reale) a un'implementazione effettiva sulla maggior parte dei sistemi POSIX.

Cosa è bash

bashiniziato come shun'implementazione compatibile (anche se precede di alcuni anni lo standard POSIX), ma col passare del tempo ha acquisito molte estensioni. Molte di queste estensioni possono modificare il comportamento degli script shell POSIX validi, quindi di per sé bashnon è una shell POSIX valida. Piuttosto, è un dialetto del linguaggio shell POSIX.

bashsupporta uno --posixswitch, che lo rende più conforme a POSIX. Prova anche a imitare POSIX se invocato come sh.

sh = bash?

Per molto tempo, /bin/shusato per indicare /bin/bashsulla maggior parte dei sistemi GNU / Linux. Di conseguenza, era quasi diventato sicuro ignorare la differenza tra i due. Ma questo ha iniziato a cambiare di recente.

Alcuni esempi popolari di sistemi in cui /bin/shnon punta /bin/bash(e su alcuni dei quali /bin/bashpotrebbe anche non esistere) sono:

  1. Moderni sistemi Debian e Ubuntu, che si collegano shper dashimpostazione predefinita a symlink ;
  2. Busybox , che di solito viene eseguito durante l'avvio del sistema Linux come parte di initramfs. Utilizza l' ashimplementazione della shell.
  3. BSD, e in generale qualsiasi sistema non Linux. OpenBSD usa pdksh, un discendente della shell Korn. FreeBSD shè un discendente della shell Bourne UNIX originale. Solaris ha il suo shche per lungo tempo non era conforme a POSIX; un'implementazione gratuita è disponibile dal progetto Heirloom .

Come puoi scoprire cosa /bin/shindica il tuo sistema?

La complicazione è che /bin/shpotrebbe essere un collegamento simbolico o un collegamento reale. Se si tratta di un collegamento simbolico, un modo portatile per risolverlo è:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Se è un collegamento reale, prova

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

In effetti, il -Lflag copre sia i collegamenti simbolici che i collegamenti fisici, ma lo svantaggio di questo metodo è che non è portatile - POSIX non richiede find di supportare l' -samefileopzione, sebbene sia GNU find sia FreeBSD find lo supportino.

Linea Shebang

Alla fine, spetta a te decidere quale usare, scrivendo la riga «shebang» come prima riga della sceneggiatura.

Per esempio

#!/bin/sh

utilizzerà sh(e qualunque cosa accada),

#!/bin/bash

userà /bin/bashse è disponibile (e fallirà con un messaggio di errore se non lo è). Naturalmente, puoi anche specificare un'altra implementazione, ad es

#!/bin/dash

Quale usare

Per i miei script, preferisco shper i seguenti motivi:

  • è standardizzato
  • è molto più semplice e facile da imparare
  • è portatile su tutti i sistemi POSIX - anche se non lo sono bash, devono farlosh

Ci sono anche vantaggi nell'utilizzo bash. Le sue caratteristiche rendono la programmazione più conveniente e simile alla programmazione in altri linguaggi di programmazione moderni. Questi includono cose come variabili e array locali con ambito. Plain shè un linguaggio di programmazione molto minimalista.


Se si esegue uno script con bashil modo di visualizzazione più utili messaggi di errore in caso di errore di sintassi. Puoi semplicemente risparmiare tempo usando bash.
PHPst

Cosa %significa all'inizio delle tue righe di comando?
JosephHarriott,

@JosephHarriott è un prompt: un personaggio stampato dalla shell stessa dopo la quale segue il tuo comando. Alcune shell usano $invece di %, o #per la shell di root.
Roman Cheplyaka,

@RomanCheplyaka quali conchiglie? Ho sempre e solo visto $e #...
JosephHarriott

@RomanCheplyaka Sono certo che shesisteva ben prima di bash (che sta per bourne-again shell). Ma era molto primitivo e non rispondeva a eventi terminali, come i ESCpersonaggi. Poi kshvenne (anche prima di bash), poi bash iniziò da coloro che amavano l'idea di un guscio migliore, ma odiavano ksh. :-)
raminr

145

sh: http://man.cx/sh
bash : http://man.cx/bash

TL; DR : bashè un superset shcon una sintassi più elegante e più funzionalità. È sicuro usare una linea bash shebang in quasi tutti i casi poiché è abbastanza onnipresente su piattaforme moderne.

NB: in alcuni ambienti sh è bash . Controllare sh --version.


31
se bash è invocato come sh, si comporta in modo leggermente diverso. Vedi gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("Invocato con il nome sh") e gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Ad esempio, nessuna sostituzione del processo.
Glenn Jackman,

11
Poiché bash è un superset di sh e alcuni sistemi operativi come FreeBSD non hanno bash installato di default, gli script in sh daranno maggiore portabilità.
user674062

1
Poiché non esiste un modo di scripting portatile per ottenere una shell POSIX per uno script specifico, gli script portatili non possono assumere più delle funzionalità di Bourne Shell.
schily,

83

Questa domanda è stata spesso nominata canonica per le persone che cercano di usare she sono sorprese dal fatto che non si comporti allo stesso modo bash. Ecco una rapida carrellata di incomprensioni e insidie ​​comuni.

Prima di tutto, dovresti capire cosa aspettarti.

  • Se esegui lo script con sh scriptname, oppure eseguilo con scriptnamee hai #!/bin/shnella riga shebang , dovresti aspettarti un shcomportamento POSIX .
  • Se esegui il tuo script con bash scriptname, o eseguilo con scriptnamee hai #!/bin/bash(o l'equivalente locale) nella riga shebang, dovresti aspettarti un comportamento Bash.

Avere un shebang corretto ed eseguire lo script digitando solo il nome dello script (possibilmente con un percorso relativo o completo ) è generalmente la soluzione preferita. Oltre a un shebang corretto, questo richiede che il file di script abbia l'autorizzazione di esecuzione ( chmod a+x scriptname).

Quindi, come differiscono effettivamente?

Il manuale di riferimento di Bash ha una sezione che tenta di enumerare le differenze ma alcune fonti comuni di confusione includono

  • [[non è disponibile in sh(solo [che è più goffo e limitato).
  • sh non ha matrici.
  • Alcune parole chiave Bash piace local, source, function, shopt, let, declare, e selectnon sono portabili a sh. (Alcune shimplementazioni supportano ad es local.)
  • Bash ha molte estensioni di sintassi in stile C come il for((i=0;i<=3;i++))ciclo a tre argomenti , l' +=assegnazione degli incrementi, ecc. La $'string\nwith\tC\aescapes'funzione è provvisoriamente accettata per POSIX (il che significa che ora funziona in Bash, ma non sarà ancora supportata da shsistemi che aderiscono solo alla corrente Specifica POSIX, e probabilmente non lo sarà per qualche tempo).
  • Bash supporta <<<'here strings'.
  • Bash ha *.{png,jpg}e {0..12}rinforza l'espansione.
  • ~si riferisce $HOMEsolo a Bash (e più in generale ~usernamealla home directory di username).Questo è in POSIX, ma potrebbe mancare in alcune /bin/shimplementazioni pre-POSIX .
  • Bash ha la sostituzione del processo con <(cmd)e >(cmd).
  • Bash ha alias di reindirizzamento di convenienza in stile Csh come &|per 2>&1 |e &>per> ... 2>&1
  • Bash supporta i coprocessi con il <>reindirizzamento.
  • Bash presenta una serie ricca di espansioni di parametri non standard espansi quali ${substring:1:2}, ${variable/pattern/replacement}, conversione caso, etc.
  • Bash ha notevolmente ampliato le strutture per l'aritmetica della shell (anche se non ha ancora supporto in virgola mobile). Esiste una $[expression]sintassi legacy obsoleta che tuttavia dovrebbe essere sostituita con la $((expression))sintassi aritmetica POSIX . ( shTuttavia, alcune implementazioni pre-POSIX legacy potrebbero non supportarlo).
  • Variabili magici come $RANDOM, $SECONDS, $PIPESTATUS[@]e $FUNCNAMEsono estensioni Bash.
  • Differenze sintattiche come export variable=valuee [ "x" == "y" ]che non sono portatili ( export variabledovrebbero essere separate dall'assegnazione variabile e il confronto di stringhe portatili nell'uso di [ ... ]un singolo segno di uguale).
  • Molte, molte estensioni solo Bash per abilitare o disabilitare il comportamento opzionale ed esporre lo stato interno della shell.
  • Molte, molte funzionalità utili per l'uso interattivo che tuttavia non influiscono sul comportamento degli script.

Ricorda, questo è un elenco abbreviato. Fare riferimento al manuale di riferimento per lo scoop completo e http://mywiki.wooledge.org/Bashism per molte buone soluzioni alternative; e / o prova http://shellcheck.net/ che avvisa per molte funzionalità solo Bash.

Un errore comune è quello di avere una #!/bin/bashriga shebang, ma comunque usando sh scriptnameper eseguire effettivamente lo script. Questo in pratica disabilita qualsiasi funzionalità solo di Bash, quindi si ottengono errori di sintassi, ad es. Per provare ad usare array. (La riga shebang è sintatticamente un commento, quindi viene semplicemente ignorata in questo scenario.)

Sfortunatamente, Bash non avviserà quando si tenta di utilizzare questi costrutti quando viene invocato come sh. Inoltre, non disabilita completamente tutte le funzionalità solo di Bash, quindi eseguire Bash invocandolo poiché shnon è un buon modo per verificare se lo script è correttamente portabile su ash/ dash/ POSIX sho varianti come Heirloomsh


2
Fondamentalmente, il TL; DR ersion è la risposta di And .
Tripleee

4
shellcheck.net era tutto ciò di cui avevo bisogno. grazie molto.
Josh Habdas,

FWIW, export variable=valueè incaricato da POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Forse non è disponibile in alcune conchiglie antiche, ma sicuramente non è un bashismo.
Roman Cheplyaka,

54

Shell è un'interfaccia tra un utente e il sistema operativo per accedere ai servizi di un sistema operativo. Può essere GUI o CLI (interfaccia della riga di comando).

sh (Bourne sh ell) è un interprete della riga di comando della shell, per sistemi operativi simili a Unix / Unix. Fornisce alcuni comandi integrati. Nel linguaggio di scripting denotiamo l'interprete come #!/bin/sh. Era uno dei più ampiamente supportati da altre shell come bash (free / open), kash (non free).

Bash ( B ourne a gain s hell) è un sostituto della shell per la shell Bourne. Bash è un superset di sh. Bash supporta sh. POSIX è un insieme di standard che definisce come dovrebbero funzionare i sistemi conformi a POSIX. Bash non è in realtà una shell conforme a POSIX. In un linguaggio di scripting denotiamo l'interprete come #!/bin/bash.

Analogia:

  • Shell è come un'interfaccia o specifiche o API.
  • sh è una classe che implementa l'interfaccia Shell.
  • Bash è una sottoclasse di sh.

inserisci qui la descrizione dell'immagine


3
Non capisco Hai menzionato sia "Bash è superset di sh" sia "Bash è una sottoclasse di sh", non sono affermazioni contrarie? Potete per favore chiarire?
Keerthana Prabhakaran,

11
Penso che questo stia cercando di dire che Bash eredita sh(quindi è una "sottoclasse" nel senso OOP) e la estende (quindi ha un superset della funzionalità).
triplo

53

Posta da UNIX.COM

Caratteristiche della shell

La tabella seguente elenca la maggior parte delle funzionalità che penso ti farebbero scegliere una shell piuttosto che un'altra. Non è destinato a essere un elenco definitivo e non include tutte le singole funzionalità possibili per ogni singola shell possibile. Una funzionalità è considerata in una shell solo nella versione fornita con il sistema operativo o se è disponibile come compilata direttamente dalla distribuzione standard. In particolare la shell C specificata di seguito è quella disponibile su SUNOS 4. *, un numero considerevole di fornitori ora spedisce invece tcsh o la propria shell C potenziata (non sempre è ovvio che stanno spedendo tcsh.

Codice:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

Chiave per la tabella sopra.

Y La funzione può essere eseguita usando questa shell.

N La funzione non è presente nella shell.

F La funzione può essere eseguita solo utilizzando il meccanismo della funzione shell.

L La libreria readline deve essere collegata alla shell per abilitare questa funzione.

Note alla tabella sopra

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.

La tua tabella non mi è utile in quanto cerca di confrontare le funzionalità di Bourne Shell e le funzionalità di ksh di prima del 1988. Se davvero crei una tabella per il 1988, dovrai rimuovere la maggior parte delle altre shell da quella tabella - incluso bash , sh e rc. Potresti spiegare da dove hai preso i valori per il tuo tavolo?
schily,

1
Consentitemi di dare alcuni suggerimenti: Job Control è stato aggiunto a Bourne Shell nel 1989 e Bourne Shell è stato creato OpenSource nel 2005. La shell Korn ha subito la sostituzione del processo almeno dal 1988 ed è OpenSource dal 1997. BTW: le vostre dichiarazioni su $ ENV non sono corretti, $ ENV viene letto / eseguito solo per shell interattive.
schily,

3
@schily Questo post è stato catturato da cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV

@schily Se ritieni che sia errato ovunque, non esitare a modificarlo in modo appropriato.
SriniV,

8
Sulla base di ciò che la schily ha esposto sembrerebbe che sarebbe meglio rimuovere questa risposta, poiché è essenzialmente fraudolenta, e OP non ha davvero controllato le informazioni che aveva incollato.
danno,

24

TERMINALE

  • programma (i) che apre una finestra
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm ed eterm.

CONCHIGLIA

  • È un programma che viene eseguito nel terminale
  • Shell è sia un interprete di comandi che un linguaggio di programmazione
  • Shell è semplicemente un processore macro che esegue comandi.
  • Macro processor significa funzionalità in cui testo e simboli vengono espansi per creare espressioni più grandi.

SH vs. BASH

SH

  • (Conchiglia)
  • È una shell specifica
  • un interprete di comandi e un linguaggio di programmazione
  • Predecessore di BASH

BASH

  • (Bourne-Again SHell)
  • È una shell specifica
  • un interprete di comandi e un linguaggio di programmazione
  • Ha funzionalità sh e altro ancora
  • Successore di SH
  • BASH è lo SHELL predefinito

MATERIALE DI RIFERIMENTO:

SHELL gnu.org:

Alla base, una shell è semplicemente un processore macro che esegue comandi. Il termine processore macro indica funzionalità in cui testo e simboli vengono espansi per creare espressioni più grandi.

Una shell Unix è sia un interprete di comandi che un linguaggio di programmazione. Come interprete di comandi, la shell fornisce l'interfaccia utente al ricco set di utility GNU. Le funzionalità del linguaggio di programmazione consentono di combinare queste utilità. I file contenenti comandi possono essere creati e diventare comandi stessi. Questi nuovi comandi hanno lo stesso stato dei comandi di sistema in directory come / bin, consentendo agli utenti o ai gruppi di stabilire ambienti personalizzati per automatizzare le loro attività comuni.

Le conchiglie possono essere utilizzate in modo interattivo o non interattivo. In modalità interattiva, accettano input digitati dalla tastiera. Quando si eseguono in modo non interattivo, le shell eseguono i comandi letti da un file.

Una shell consente l'esecuzione di comandi GNU, sia in modo sincrono che asincrono. La shell attende il completamento dei comandi sincroni prima di accettare più input; i comandi asincroni continuano ad essere eseguiti in parallelo con la shell mentre legge ed esegue comandi aggiuntivi. I costrutti di reindirizzamento consentono un controllo accurato dell'input e dell'output di tali comandi. Inoltre, la shell consente il controllo sul contenuto degli ambienti dei comandi.

Le shell forniscono anche un piccolo set di comandi integrati (incorporati) che implementano funzionalità impossibili o scomode da ottenere tramite utility separate . Ad esempio, cd, break, continue ed exec non possono essere implementati al di fuori della shell perché manipolano direttamente la shell stessa. La cronologia, getopts, kill o built-in pwd, tra gli altri, potrebbero essere implementati in utility separate, ma sono più convenienti da usare come comandi integrati. Tutti i builtin della shell sono descritti nelle sezioni successive.

Sebbene l'esecuzione dei comandi sia essenziale, la maggior parte della potenza (e della complessità) delle shell è dovuta ai loro linguaggi di programmazione integrati. Come ogni linguaggio di alto livello, la shell fornisce variabili, costrutti di controllo di flusso, quotazioni e funzioni.

Le conchiglie offrono funzionalità specifiche per l'uso interattivo piuttosto che per aumentare il linguaggio di programmazione. Queste funzionalità interattive includono controllo del lavoro, modifica della riga di comando, cronologia dei comandi e alias. Ognuna di queste funzioni è descritta in questo manuale.

BASH gnu.org:

Bash è la shell, o interprete del linguaggio di comando, per il sistema operativo GNU. Il nome è un acronimo di "Bourne-Again SHell", un gioco di parole su Stephen Bourne, l'autore dell'antenato diretto dell'attuale shell sh Unix, che apparve nella settima edizione della versione Bell Labs Research di Unix.

Bash è in gran parte compatibile con sh e incorpora utili funzionalità dalla shell Ksh Korn e dalla shell Csh Csh. È inteso come un'implementazione conforme della parte Shell e strumenti IEEE POSIX della specifica IEEE POSIX (IEEE Standard 1003.1). Offre miglioramenti funzionali su sh sia per uso interattivo che di programmazione.

Mentre il sistema operativo GNU fornisce altre shell, inclusa una versione di csh, Bash è la shell predefinita . Come altri software GNU, Bash è abbastanza portatile. Funziona attualmente su quasi tutte le versioni di Unix e su alcuni altri sistemi operativi: esistono porte supportate indipendentemente per piattaforme MS-DOS, OS / 2 e Windows.


14

Altre risposte hanno generalmente sottolineato la differenza tra Bash e uno standard di shell POSIX. Tuttavia, quando si scrivono script di shell portatili e vengono utilizzati per la sintassi di Bash, è molto utile un elenco di basismi tipici e corrispondenti soluzioni POSIX pure. Tale elenco è stato compilato quando Ubuntu è passato da Bash a Dash come shell di sistema predefinita e può essere trovato qui: https://wiki.ubuntu.com/DashAsBinSh

Inoltre, esiste un ottimo strumento chiamato checkbashisms che verifica la presenza di bashismi nella sceneggiatura e risulta utile quando si desidera assicurarsi che la sceneggiatura sia portatile.


Questo è sostanzialmente ciò a cui la mia risposta fino ad ora si riduce davvero. +1
tripleee

8

Sono quasi identici ma bashhanno più funzionalità - shè (più o meno) un sottoinsieme più vecchio di bash.

shspesso significa l'originale Bourne shell, che precede bash( Bourne *again* shell), ed è stato creato nel 1977. Ma, in pratica, potrebbe essere meglio pensarlo come una shell altamente cross-compatibile conforme allo standard POSIX del 1992.

Gli script che iniziano con #!/bin/sho usano la shshell di solito lo fanno per compatibilità con le versioni precedenti. Qualsiasi sistema operativo unix / linux avrà una shshell. Su Ubuntu shspesso invoca dashe su MacOS è una versione POSIX speciale di bash. Queste shell possono essere preferite per comportamento conforme allo standard, velocità o compatibilità con le versioni precedenti.

bashè più recente dell'originale sh, aggiunge più funzioni e cerca di essere retrocompatibile sh. In teoria, i shprogrammi dovrebbero essere eseguiti bash. bashè disponibile su quasi tutte le macchine linux / unix e di solito usato di default - con la notevole eccezione di MacOS di default a zshCatalina (10.15). FreeBSD, di default, non viene bashinstallato.


shprecede di gran lunga POSIX. In questi giorni, speri che qualsiasi shcosa trovi sia almeno compatibile con POSIX; ma sui sistemi legacy questo non è affatto scontato. POSIX stadardizza molto più della shell; infatti, si potrebbe sostenere che la standardizzazione delle chiamate del sistema operativo e delle funzioni di libreria è più importante.
Tripleee,

Ho rimosso le cose su POSIX per renderlo meno confuso
Ryan Taylor,

3

/bin/shpuò o meno invocare lo stesso programma di /bin/bash.

shsupporta almeno le funzionalità richieste da POSIX (presupponendo una corretta implementazione). Potrebbe supportare anche le estensioni.

bash, la "Bourne Again Shell", implementa le funzionalità richieste per le estensioni specifiche di sh plus bash. Il set completo di estensioni è troppo lungo per essere descritto qui e varia a seconda delle nuove versioni. Le differenze sono documentate nel manuale di bash. genereinfo bash e leggere la sezione "Funzionalità Bash" (sezione 6 della versione corrente) o leggere la documentazione corrente online .


shti dà solo una shell POSIX, se hai la giusta PATHconfigurazione nella tua shell corrente. Non esiste un nome PATH definito che ti dia una shell POSIX.
schily,

Per molto tempo, ad esempio, shnon ti è stato nemmeno fornito un guscio POSIX su Solaris.
Tripleee

3

bash e sh sono due diverse conchiglie. Fondamentalmente bash è sh, con più funzionalità e una migliore sintassi. La maggior parte dei comandi funzionano allo stesso modo, ma sono diversi. Bash (bash) è una delle molte shell Unix disponibili (ma le più utilizzate). Bash sta per "Bourne Again SHell" ed è un rimpiazzo / miglioramento della shell Bourne originale (sh).

Gli script di shell sono script in qualsiasi shell, mentre gli script di Bash sono script specifici per Bash. In pratica, tuttavia, "shell script" e "bash script" sono spesso usati in modo intercambiabile, a meno che la shell in questione non sia Bash.

Detto questo, dovresti realizzare / bin / sh sulla maggior parte dei sistemi sarà un collegamento simbolico e non invocherai sh. In Ubuntu / bin / sh usato per collegarsi a bash, comportamento tipico nelle distribuzioni Linux, ma ora è cambiato in collegamento a un'altra shell chiamata dash. Vorrei usare bash, dato che è praticamente lo standard (o almeno il più comune, dalla mia esperienza). In effetti, sorgono problemi quando uno script bash userà #! / Bin / sh perché lo script-maker presume che il link debba bash quando non è necessario.


0

Le differenze nel modo più semplice possibile: dopo avere una comprensione di base, gli altri commenti pubblicati sopra saranno più facili da cogliere.

Conchiglia : "Shell" è un programma che facilita l'interazione tra l'utente e il sistema operativo (kernel). Sono disponibili molte implementazioni di shell, come sh, bash, csh, zsh ... ecc.

Utilizzando uno qualsiasi dei programmi Shell, saremo in grado di eseguire comandi supportati da quel programma shell.

Bash - Deriva da B ourne- un guadagno Sh ell. Usando questo programma, saremo in grado di eseguire tutti i comandi specificati da Shell. Inoltre, saremo in grado di eseguire alcuni comandi specificamente aggiunti a questo programma. Bash ha retrocompatibilità con sh.

Sh - Deriva da Bourne Sh ell. "sh" supporta tutti i comandi specificati nella shell. Mezzi, Usando questo programma, saremo in grado di eseguire tutti i comandi specificati da Shell.

Per ulteriori informazioni, fare: - https://man.cx/sh - https://man.cx/bash


Per capire POSIX, leggere la risposta da Alex Si prega di verificare: stackoverflow.com/a/1780614/1261003
Raihanhbh

Non sto cercando di capire POSIX. Sto rivedendo la tua risposta e come tale ho bisogno di vederla la tua risposta aggiunge valore. Non penso che lo faccia.
Scratte il

Credo che questi piccoli chiarimenti aiuterebbero un principiante a comprendere più facilmente il gergo usato nelle discussioni di cui sopra. @Scratte
Raihanhbh

-1

Il sistema operativo Linux offre diversi tipi di shell. Sebbene le shell abbiano molti comandi in comune, ogni tipo ha caratteristiche uniche. Studiamo diversi tipi di conchiglie maggiormente utilizzate.

Sh shell:

Sh shell è anche conosciuta come Bourne Shell. Sh shell è la prima shell sviluppata per computer Unix da Stephen Bourne ai Bell Labs di AT&T nel 1977. Include numerosi strumenti di scripting.

Bash shell:

Bash shell sta per Bourne Again Shell. La shell Bash è la shell predefinita nella maggior parte della distribuzione di Linux e sostituisce Sh Shell (la shell Sh verrà eseguita anche nella shell Bash). Bash Shell può eseguire la stragrande maggioranza degli script di shell SH senza modifiche e fornire anche funzionalità di modifica della riga di comando.


C'era una shell precedente di Ken Thompson. La shell Bourne fu ufficialmente introdotta in Unix v7 (1979).
Tripleee,
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.