bash e sh eseguono uno script in modo diverso? Ho eseguito uno script di shell con bash e sh e ho ottenuto lo stesso output. Allora qual è la differenza?
Inoltre, quando esegui ./executable
, utilizza bash o sh?
Commenti
Risposta
Dipende dal sistema in esecuzione. Uno molti sistemi operativi, in particolare quelli basati su Linux, sh
è un collegamento a bash
.
In tal caso, cè ci sono ancora alcune differenze nel comportamento in cui bash
cerca di essere più simile alla tradizionale bourne shell quando viene chiamata sh
, ma accetta ancora la maggior parte dei bashismi.
Su alcuni altri sistemi operativi, come quelli basati su Debian, sh
è fornito da dash
, non da bash
. Ciò fa una differenza molto più grande in quanto dash
non supporta i bashismi, essendo progettato per essere unimplementazione della shell POSIX pulita.
Sui sistemi operativi proprietari, sh
è spesso fornito da un ksh88
conforme a POSIX che, come dash
, non implementa i bashismi. Su Solaris 10 e versioni precedenti, a seconda di quale sia il tuo PATH, sh
sarà probabilmente una shell Bourne legacy, precedente a POSIX.
In ogni caso, probabilmente hai lo stesso risultato del test semplicemente perché lo script non utilizzava alcun comando, opzione o sintassi specifico bash
.
Quando si esegue ./executable
, quale shell verrà eseguita dipende essenzialmente dallo shebang scritto allinizio dello script .executable. Sarà bash
se lo schema lo specifica:
#!/bin/bash ....
Se non cè lo shebang e chiami lo script da una shell conforme a POSIX, lo script dovrebbe essere tecnicamente eseguito dal primo sh
trovato nel PATH. Molti interpreti di shell come bash
, dash
e ksh
si considerano POSIX così interpretare il copione. Tieni presente che la variabile di ambiente SHELL
non viene utilizzata qui.
Commenti
- Mi sono guardato intorno in
/bin
e ho scoperto chesh
è un collegamento simbolico adash
anziché abash
. Allora come hanno funzionato lo stesso? ' in realtà non eseguiva comandi di script bash, ma solo comandi da terminale per utilizzare altri pacchetti ' strumenti. - Se il tuo script di shell chiama solo in sequenza altri comandi, qualsiasi interprete di shell lo eseguirà con lo stesso risultato. Niente di imprevisto qui.
- Questo non è ' correlato alla domanda, ma qual è esattamente la differenza tra
bash
edash
? - Entrambi utilizzano la sintassi della shell Bourne. Come ho scritto nella mia risposta,
dash
è unimplementazione pulita dello standard della shell POSIX. Daltra parte,bash
è una shell con un numero piuttosto elevato di estensioni e funzionalità non standard, alcune ispirate aksh
,ksh93
e altre shell, e alcune specifiche di bash, note come bashismi. Esiste uno strumento chiamato checkbashisms che aiuta a identificare tutto ciò che non è strettamente portabile in un dato script di shell.
Answer
Sì, potrebbe essere, ma non deve essere. Le due shell non sono le stesse, ma le basi sono compatibili. Controlla questo post per maggiori dettagli.
Puoi utilizzare la seguente riga in uno script per controllare linterprete utilizzato:
ps h -p $$ -o args="" | cut -f1 -d" "
Puoi specificare esplicitamente la shell che deve essere utilizzata quando lo script viene eseguito direttamente con la riga sheebang
:
#!/bin/sh
o
#!/bin/bash
$SHELL
non viene utilizzata per decidere quale shell interpreterà la./executable
script. Non ' n dice necessariamente qual è la shell corrente.