Qual è la differenza tra lutilizzo di bash e sh per eseguire uno script?

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

  • @Pandya La variabile $SHELL non viene utilizzata per decidere quale shell interpreterà la ./executable script. Non ' n dice necessariamente qual è la shell corrente.
  • @jlliagre oh! ok. wiki.debian.org dice " SHELL = La shell corrente. "
  • @Pandya in realtà dovrebbe dire " La ' shell di accesso dellutente ". La shell corrente potrebbe essere diversa.

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 che sh è un collegamento simbolico a dash anziché a bash. 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 e dash?
  • 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 a ksh, 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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *