Risposte:
Per eseguire uno sh
script non eseguibile , utilizzare:
sh myscript
Per eseguire uno bash
script non eseguibile , utilizzare:
bash myscript
Per avviare un eseguibile (che è qualsiasi file con permesso eseguibile); basta specificarlo con il suo percorso:
/foo/bar
/bin/bar
./bar
Per rendere eseguibile uno script, concedi 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 osservando 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 forniti dallo script come argomenti successivi.
Ciò significa che ogni script eseguibile dovrebbe avere un hashbang . In caso contrario, non stai dicendo al kernel di cosa si tratta , e quindi il kernel non sa quale programma utilizzare per interpretarlo. Potrebbe essere bash
, perl
, python
, sh
, o qualcos'altro. (In realtà, il kernel utilizzerà 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 alcuni ma con sottili differenze comportamentali come il caso tra sh
e bash
).
/usr/bin/env
Più comunemente, vedrai gli hash bang in questo modo:
#!/bin/bash
Il risultato è che il kernel eseguirà il programma /bin/bash
per interpretare lo script. Sfortunatamente, bash
non viene sempre spedito 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 vengono bash
spedite in varie posizioni, come /usr/xpg/bin/bash
o /usr/local/bin/bash
.
Per scrivere uno script bash portatile, non possiamo quindi fare affidamento sulla codifica hardware della posizione del bash
programma. POSIX ha già un meccanismo per trattare con che: PATH
. L'idea è che tu installi i tuoi programmi in una delle directory che si trovano PATH
e il sistema dovrebbe essere in grado di trovare il tuo programma quando vuoi eseguirlo per nome.
Purtroppo, non puoi semplicemente fare questo:
#!bash
Il kernel non (qualcuno potrebbe) fare una PATH
ricerca per te. C'è un programma che può fare una PATH
ricerca per te, però, si chiama env
. Fortunatamente, in quasi tutti i sistemi è env
installato un programma /usr/bin
. Quindi iniziamo a env
utilizzare un percorso hardcoded, che quindi esegue una PATH
ricerca bash
e lo esegue in modo che possa interpretare il tuo script:
#!/usr/bin/env bash
Questo approccio ha un aspetto negativo: secondo POSIX, l'hashbang può avere un argomento . In questo caso, utilizziamo bash
come argomento il env
programma. Ciò significa che non ci rimane spazio per passare argomenti bash
. Quindi non c'è modo di convertire qualcosa di simile #!/bin/bash -exu
a questo schema. Dovrai invece inserire set -exu
l'hashbang.
Questo approccio ha anche un altro vantaggio: alcuni sistemi potrebbero essere forniti con un /bin/bash
, ma l'utente potrebbe non apprezzarlo, potrebbe trovarsi difettoso o obsoleto e potrebbe aver installato il proprio bash
altrove. Questo è spesso il caso di OS X (Mac) in cui Apple spedisce un prodotto obsoleto /bin/bash
e gli utenti installano un aggiornamento /usr/local/bin/bash
usando qualcosa come Homebrew. Quando si utilizza l' env
approccio che esegue una PATH
ricerca, si tiene conto delle preferenze dell'utente e si utilizza la sua bash preferita rispetto a quella fornita dal suo sistema.
zsh
come shell, dovrei usare il hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
se (e solo se) il codice all'interno dello script dovrebbe essere eseguito dalla shell Z.
Per la shell bourne:
sh myscript.sh
Per bash:
bash myscript.sh
Se si desidera che lo script venga eseguito nella shell corrente (ad es. Si desidera che possa influire sulla directory o sull'ambiente), si dovrebbe dire:
. /path/to/script.sh
o
source /path/to/script.sh
Si noti che /path/to/script.sh
può essere relativo, ad esempio . bin/script.sh
esegue script.sh
nella bin
directory nella directory corrente.
Innanzitutto, autorizza l'esecuzione: -
chmod +x script_name
sh script_name
bash script_name
./script_name
NOTA : -puoi verificare se il file è eseguibile o meno usando 'ls -a'
Piccola aggiunta, per eseguire un interprete dalla stessa cartella, usando ancora #! Hashbang negli script.
Ad esempio un eseguibile php7.2 copiato da / usr / bin si trova in una cartella lungo uno script hello .
#!./php7.2
<?php
echo "Hello!";
Per eseguirlo:
./hello
Che si comportano allo stesso modo di:
./php7.2 hello