GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire uno script di shell su una console Unix o un terminale Mac?

Per avviare lo script di shell 'file.sh':

sh file.sh

bash file.sh

Un'altra opzione è impostare il permesso eseguibile usando il comando chmod:

chmod +x file.sh

Ora esegui il file .sh come segue:

./file.sh

Per eseguire un sh non eseguibile script, usa:

sh myscript

Per eseguire un bash non eseguibile script, usa:

bash myscript

Per avviare un eseguibile (che è qualsiasi file con autorizzazione eseguibile); basta specificarlo tramite il suo percorso:

/foo/bar
/bin/bar
./bar

Per rendere eseguibile uno script, assegnagli i permessi necessari:

chmod +x bar
./bar

Quando un file è eseguibile, il kernel è responsabile di capire come eseguirlo. Per i non binari, questo viene fatto guardando la prima riga del file. Dovrebbe contenere un hashbang :

#! /usr/bin/env bash

L'hashbang dice al kernel quale programma eseguire (in questo caso il comando /usr/bin/env viene eseguito con l'argomento bash ). Quindi, lo script viene passato al programma (come secondo argomento) insieme a tutti gli argomenti che hai fornito allo script come argomenti successivi.

Ciò significa che ogni script eseguibile dovrebbe avere un hashbang . In caso contrario, non stai dicendo al kernel cos'è è , e quindi il kernel non sa quale programma usare per interpretarlo. Potrebbe essere bash , perl , python , sh , o qualcos'altro. (In realtà, il kernel userà spesso la shell predefinita dell'utente per interpretare il file, il che è molto pericoloso perché potrebbe non essere affatto l'interprete giusto o potrebbe essere in grado di analizzarne una parte ma con sottili differenze comportamentali come è il caso tra sh e bash ).

Una nota su /usr/bin/env

Più comunemente, vedrai hash bang in questo modo:

#!/bin/bash

Il risultato è che il kernel eseguirà il programma /bin/bash interpretare la sceneggiatura. Sfortunatamente, bash non è sempre fornito per impostazione predefinita e non è sempre disponibile in /bin . Mentre su macchine Linux di solito lo è, ci sono una serie di altre macchine POSIX in cui bash spedisce in varie località, come /usr/xpg/bin/bash o /usr/local/bin/bash .

Per scrivere uno script bash portatile, non possiamo quindi fare affidamento sull'hard-coding della posizione di bash programma. POSIX ha già un meccanismo per gestirlo:PATH . L'idea è di installare i programmi in una delle directory che si trovano in PATH e il sistema dovrebbe essere in grado di trovare il tuo programma quando vuoi eseguirlo per nome.

Purtroppo, non puoi basta fare questo:

#!bash

Il kernel non eseguirà (alcuni potrebbero) un PATH cercarti. C'è un programma che può fare un PATH cerca te, però, si chiama env . Fortunatamente, quasi tutti i sistemi hanno un env programma installato in /usr/bin . Quindi iniziamo env utilizzando un percorso hardcoded, che quindi esegue un PATH cerca bash e lo esegue in modo che possa interpretare il tuo script:

#!/usr/bin/env bash

Questo approccio ha uno svantaggio:secondo POSIX, l'hashbang può avere un argomento . In questo caso, usiamo bash come argomento del env programma. Ciò significa che non abbiamo più spazio per passare argomenti a bash . Quindi non c'è modo di convertire qualcosa come #!/bin/bash -exu a questo schema. Dovrai inserire set -exu dopo l'hashbang invece.

Questo approccio ha anche un altro vantaggio:alcuni sistemi possono essere forniti con un /bin/bash , ma all'utente potrebbe non piacere, potrebbe trovarlo difettoso o obsoleto e potrebbe aver installato il proprio bash altrove. Questo è spesso il caso su OS X (Mac) in cui Apple fornisce un /bin/bash obsoleto e gli utenti installano un /usr/local/bin/bash aggiornato usando qualcosa come Homebrew. Quando usi il env approccio che fa un PATH search, prendi in considerazione le preferenze dell'utente e usi la sua bash preferita rispetto a quella fornita con il suo sistema.


Per la bourne shell:

sh myscript.sh

Per bash:

bash myscript.sh

Linux
  1. Come fermare lo script Loop Bash nel terminale?

  2. Come controllare la sottostringa in Shell Script Bash?

  3. Come eseguire uno script di shell in background?

  4. Come si esegue uno script all'accesso in *nix?

  5. Esegui uno script di shell nel nuovo terminale dal terminale corrente

Come eseguire uno script Bash {7 metodi}

Come eseguire il comando / script della shell di Linux in background

Come eseguire lo script della shell come servizio SystemD in Linux

Come eseguire uno script Bash

Come creare ed eseguire uno script di shell in Ubuntu 22.04

Come eseguire uno script .sh da qualsiasi percorso in un terminale?