Perché ricevo output diversi in caso di sh e bash?


8

Ho il seguente semplice script:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

Uscita nel caso in cui corro con sh file.sh:

Bash version ...
{1..99..2}

Uscita nel caso in cui corro con bash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

Ho due domande:

  1. Se ho scritto una riga shabang specificando la shell, non dovrebbe funzionare con bash se uso sh file.sho bash file.sh?

  2. Capisco che $BASH_VERSIONnon è riconosciuto da sh ma qual è il problema con for loop? Perché non stampare i numeri?

Risposte:


16

sh, il guscio di Bourne, è vecchio . Il suo comportamento è specificato dallo standard POSIX . Se vuoi un nuovo comportamento, usi bashla shell Bourne Again, che ti aggiunge continuamente nuove funzionalità. Su molti sistemi, shè giusto bashe bashattiva una modalità di compatibilità quando viene eseguito con quel nome. Su Ubuntu, shè dash, la shell Debian Almquist.

L'espansione del controvento è una funzionalità relativamente nuova e non sarebbe disponibile anche nei vecchi bash. Certamente non dovrebbe esserci sh.

La linea shebang è rispettata solo se si chiama lo script come eseguibile:

./myscript.sh

Posso dare uno script a qualsiasi shebang e averlo ancora aperto in Python eseguendo:

python myscript.sh

Vedi queste eccellenti domande su Unix e Linux:


5

SH è stupido. Non può fare niente.

Conosce solo i comandi più elementari. Non fa nient'altro.

Non può comprendere {1..99} come valore numerico. Lo capisce come una stringa.

SH / Dash non è sviluppato. È pensato per essere una richiesta di emergenza per circostanze DIRE (in modalità interattiva. Altrimenti, è davvero una buona cosa per gli script.).

Bash è raccomandato in quanto può fare tutto ciò che SH può fare, così come la più recente personalizzazione e potenti funzionalità.

In risposta a # 1, #!viene analizzato solo se il programma viene chiamato direttamente. (come in, ./program.sh)


6
" È pensato per essere un prompt di emergenza per circostanze DIRE. " dash, Che come dici tu fornisce shin Ubuntu, non è presente principalmente "per essere un prompt di emergenza per circostanze DIRE" ma invece il sistema può funzionare e avviarsi velocemente . In questo modo, dashè adatto ad un uso in un sistema operativo moderno, ma ciò che è adatto per è come un basso profilo, shell veloce per lo scripting - in particolare, l'esecuzione di script di sistema durante l'avvio di un grande, complesso, moderno sistema operativo, con il minimo sovraccarico di prestazioni.
Eliah Kagan,

@EliahKagan Usi SH solo se qualcosa di terribilmente sbagliato.
Kaz Wolfe,

1
Usi shabbastanza costantemente, e particolarmente intensamente come stivali Ubuntu. È principalmente importante per i suoi usi di script automatici, e questo è un caso d'uso molto importante in Ubuntu. (Se dovessi rimuovere il /bin/shlink simbolico - in modo che, in effetti, non ci sarebbe "nessuna SH" - le cose andrebbero terribilmente male: Ubuntu non potrebbe avviarsi in uno stato utilizzabile.)
Eliah Kagan il

@EliahKagan Quando hai usato SH come terminale preferito? So che lo usi per lo script, ma quando lo usi effettivamente in modalità interattiva?
Kaz Wolfe,

2
Ieri, per verificare quanto fosse portatile un comando. Ma il tuo punto che l'uso interattivo del trattino è raro è valido. (E comunque, il contesto del mio uso interattivo era ancora orientato allo scripting.) .... Ma "uso" non significa "uso interattivo" e, soprattutto, il caso d'uso in questa domanda non è interattivo!
Eliah Kagan,
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.