Script Bash non funziona con `sh`

Sto provando un semplice script e mi chiedo perché funziona bene quando eseguito dalla directory: ./test.sh ma quando provo con il command "sh" sh test.sh non funziona:

 test.sh: 3: test.sh: [[: not found test.sh: 7: test.sh: [[: not found 

script:

  • Problemi con WGET per trasferire i file da un server FTP
  • Bash: eseguire un eseguibile che fornisce un buon stato di output
  • Evita duplicati nella storia bash
  • Come ping in Linux finché l'ospite non è conosciuto?
  • Reindirizzare a 404 se il nome del file passato come parametro non si esce
  • Come recuperare da un file cancellato / bin / bash?
  •  #!/usr/bin/env bash if [[ $1 = one ]] then printf "%b" "two\n" >&2 exit 0 elif [[ $1 = two ]] then printf "%b" "one\n" >&2 exit 0 else printf "%b" "Specify argument: one/two\n" exit 1 fi 

    2 Solutions collect form web for “Script Bash non funziona con `sh`”

    Sommario

    sh è un programma diverso da bash .

    Dettaglio

    Il problema è che la shell Bourne ( sh ) non è la shell Bourne Again ( bash ). Vale a dire, sh non comprende il [[ pragma. Infatti, non comprende neppure. [ è un programma effettivo o un collegamento a / bin / test (o / usr / bin / [, / usr / bin / test].

     $ which [ /bin/[ $ ls -lh /bin/[ -r-xr-xr-x 2 root wheel 42K Feb 29 17:11 /bin/[ 

    Quando si esegue lo script direttamente da ./test.sh , lo script viene chiamato come primo argomento al programma specificato nella prima row. In questo caso:

     #!/usr/bin/env bash 

    Spesso, questo è direttamente l'interpnetworking ( /bin/bash o un numero di altri interpreti di script), ma nel tuo caso stai utilizzando env per eseguire un programma in un ambiente modificato – ma che segue l'argomento è ancora bash. In effetti, ./test.sh è bash test.sh ./test.sh

    Poiché sh e bash sono bash diversi con interpretazioni di syntax diverse, stai visualizzando quell'errore. Se si esegue bash test.sh , si dovrebbe vedere ciò che si prevede.

    Ulteriori informazioni

    Altri hanno indicato nei commenti che /bin/sh può essere un collegamento o un'altra shell. Storicamente, sh era la shell di Bourne sul vecchio AT & T Unix e nella mia mente la discesa canonica. Tuttavia, ciò è diverso nelle varianti BSD e si è divergato in altri sisthemes e distribuzioni a base di Unix nel tempo. Se sei veramente interessato alle operazioni interne (compresi come / bin / sh e / bin / bash possono essere lo stesso programma e si comportno in modo totalmente diverso), leggere quanto segue:

    SuperUser: Qual è la differenza tra bash e sh

    Wikipedia: Copertina di Bourne

    Come notato: / bin / sh tipicamente (anche se non sempre) invoca una shell Bourne conforms a POSIX. Bash non è Bourne.

    Bash tenterà di emulare Bourne quando viene richiamato come 'sh' (come quando / bin / sh si collega o link a / bin / bash) oppure se $ POSIXLY_CORRECT è definito nell'ambiente invocante, quando viene richiamato con l'opzione di invocazione –posix, o quando è stato eseguito "set -o posix". Ciò consente di testare uno script shell / command Bourne per la conformità POSIX.

    In alternativa, invocare i comandi di script / test con una shell conosciuta conforms a POSIX. 'dash' è vicino, il shell Korn (ksh) IIRC offre anche un'opzione conforms a POSIX.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.