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
/bine ho scoperto cheshè un collegamento simbolico adashanziché 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
bashedash? - 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,ksh93e 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
$SHELLnon viene utilizzata per decidere quale shell interpreterà la./executablescript. Non ' n dice necessariamente qual è la shell corrente.