it-swarm-eu.dev

Come eseguire uno script Shell su una console Unix o terminale Mac?

Lo so, lo dimentico e lo reimparo di nuovo. È ora di annotarlo.

483
P-A

Per eseguire uno script sh non eseguibile, utilizzare:

sh myscript

Per eseguire uno script bash non eseguibile, utilizzare:

bash myscript

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

/foo/bar
/bin/bar
./bar

Per rendere eseguibile uno script, dargli l'autorizzazione necessaria:

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 che è eseguibile dovrebbe avere un hashbang . In caso contrario, non stai dicendo al kernel cosa è è, 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, che è molto pericoloso perché potrebbe non essere affatto l'interprete giusto o potrebbe essere in grado di analizzarne alcune ma con sottili differenze comportamentali come il caso tra sh e bash).

Una nota su /usr/bin/env

Più comunemente, vedrai l'hash bang in questo modo:

#!/bin/bash

Il risultato è che il kernel eseguirà il programma /bin/bash per interpretare lo script. Purtroppo, bash non viene sempre spedito per impostazione predefinita e non è sempre disponibile in /bin. Mentre sulle macchine Linux è di solito, ci sono una serie di altre macchine POSIX in cui bash viene spedito in varie posizioni, come /usr/xpg/bin/bash o /usr/local/bin/bash.

Per scrivere uno script bash portatile, non possiamo quindi fare affidamento sull'hardcoding del percorso del programma bash. POSIX ha già un meccanismo per gestire questo: PATH. L'idea è di installare i tuoi programmi in una delle directory che sono in PATH e il sistema dovrebbe essere in grado di trovare il tuo programma quando vuoi eseguirlo per nome.

Purtroppo, tunon puoifai questo:

#!bash

Il kernel non (qualcuno potrebbe) fare una ricerca PATH per te. Esiste un programma che può fare una ricerca PATH per te, ma è chiamato env. Fortunatamente, quasi tutti i sistemi hanno un programma env installato in /usr/bin. Quindi iniziamo env usando un percorso hardcoded, che quindi esegue una 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 programma env. Ciò significa che non abbiamo più spazio per passare argomenti a bash. Quindi non c'è modo di convertire qualcosa come #!/bin/bash -exu in questo schema. Dovrai inserire set -exu dopo l'hashbang.

Questo approccio ha anche un altro vantaggio: alcuni sistemi possono essere spediti con un /bin/bash, ma l'utente potrebbe non gradirlo, potrebbe trovarlo bug o obsoleto, e potrebbe aver installato il suo bash da qualche altra parte. Questo è spesso il caso di OS X (Mac) in cui Apple spedisce un /bin/bash obsoleto e gli utenti installano un /usr/local/bin/bash aggiornato usando qualcosa come Homebrew. Quando si utilizza l'approccio env che esegue una ricerca PATH, si prendono in considerazione le preferenze dell'utente e si utilizza la sua bash preferita su quella con cui il suo sistema è stato spedito.

895
lhunath

Per avviare lo script 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
76
P-A

Per la bourne Shell:

sh myscript.sh

Per bash:

bash myscript.sh
13
anon

Se vuoi che lo script venga eseguito nella Shell corrente (ad esempio vuoi che sia in grado di influenzare la tua directory o l'ambiente) dovresti dire:

. /path/to/script.sh

source /path/to/script.sh

Si noti che /path/to/script.sh può essere relativo, ad esempio . bin/script.sh esegue script.sh nella directory bin nella directory corrente.

10
Chas. Owens

L'estensione del file .command è assegnata a Terminal.app. Fare doppio clic su qualsiasi file di comando .com lo eseguirà.

0
benwiggy

In primo luogo, dare il permesso per l'esecuzione: -
chmod +x script_name 

  1. Se lo script non è eseguibile: -
    Per l'esecuzione del file di script sh: -
    sh script_name
    Per eseguire il file di script di bash: -
    bash script_name
  2. Se lo script è eseguibile: -
    ./script_name

NOTE: - puoi controllare se il file è eseguibile o meno usando 'ls -a'

0
Vineet Jain