Hoe voer je een shellscript uit op een Unix-console of Mac-terminal?

Ik weet het, vergeet het en leer het opnieuw. Tijd om het op te schrijven.


Antwoord 1, autoriteit 100%

Om een niet-uitvoerbaar sh-script uit te voeren, gebruik je:

sh myscript

Om een niet-uitvoerbaar bash-script uit te voeren, gebruik je:

bash myscript

Om een uitvoerbaar bestand te starten (dit is elk bestand met uitvoerbare toestemming); je specificeert het gewoon door zijn pad:

/foo/bar
/bin/bar
./bar

Om een script uitvoerbaar te maken, geeft u het de nodige toestemming:

chmod +x bar
./bar

Als een bestand uitvoerbaar is, is de kernelverantwoordelijk voor het uitzoeken hoe het moet worden uitgevoerd. Voor niet-binaire bestanden wordt dit gedaan door naar de eerste regel van het bestand te kijken. Het moet een hashbangbevatten:

#! /usr/bin/env bash

De hashbang vertelt de kernel welk programma moet worden uitgevoerd (in dit geval wordt het commando /usr/bin/envuitgevoerd met het argument bash). Vervolgens wordt het script aan het programma doorgegeven (als tweede argument), samen met alle argumenten die u het script als volgende argumenten hebt gegeven.

Dat betekent elk script dat uitvoerbaar is, moet een Hashbang hebben. Als dat niet het geval is, vertel je de kernel niet wat het is , en daarom weet de kernel niet wat het programma te gebruiken om het te interpreteren. Het kan bash, perl, python, sh, of iets anders. (In werkelijkheid zal de kernel vaak de standaardschaal van de gebruiker gebruiken om het bestand te interpreteren, wat erg gevaarlijk is, omdat het misschien niet de juiste tolk is of het is misschien in staat om er een deel van te ontleden, maar met subtiele gedragsverschillen Het geval tussen shen bash).

Een opmerking over /usr/bin/env

Meestal zie je Hash Bangs zoals SO:

#!/bin/bash

Het resultaat is dat de kernel het programma /bin/bashuitvoert om het script te interpreteren. Helaas wordt bashniet altijd standaard verzonden en is het niet altijd beschikbaar in /bin. Tijdens Linux-machines is het meestal, er zijn een reeks andere POSIX-machines, waar bashschepen op verschillende locaties, zoals /usr/xpg/bin/bashof /usr/local/bin/bash.

Om een ​​draagbaar bash-script te schrijven, kunnen we daarom niet vertrouwen op hardcodering van de locatie van de bash-programma. Posix heeft al een mechanisme voor het omgaan met dat: PATH. Het idee is dat u uw programma’s in een van de mappen installeert die zich in PATHen het systeem moet in staat zijn om uw programma te vinden wanneer u het op naam wilt uitvoeren.

Helaas, u kan gewoon doen:

#!bash

De kernel zal (sommigen misschien) geen PATH-zoekopdracht voor je uitvoeren. Er is echter een programma dat een PATH-zoekopdracht voor je kan uitvoeren, het heet echter env. Gelukkig hebben bijna alle systemen een envprogramma geïnstalleerd in /usr/bin. Dus we starten envmet een hardgecodeerd pad, dat dan een PATHzoekt naar bashen het uitvoert zodat het je script kan interpreteren:

#!/usr/bin/env bash

Deze aanpak heeft één nadeel: volgens POSIX kan de hashbang één argumenthebben. In dit geval gebruiken we bashals argument voor het programma env. Dat betekent dat we geen ruimte meer hebben om argumenten door te geven aan bash. Er is dus geen manier om iets als #!/bin/bash -exunaar dit schema te converteren. Je moet in plaats daarvan set -exuplaatsen na de hashbang.

Deze aanpak heeft ook nog een ander voordeel: sommige systemen kunnen worden geleverd met een /bin/bash, maar de gebruiker vindt het misschien niet leuk, vindt het misschien buggy of verouderd, en heeft mogelijk zijn eigen bashergens anders. Dit is vaak het geval op OS X (Macs) waar Apple een verouderde /bin/bashlevert en gebruikers een up-to-date /usr/local/bin/bashiets als Homebrew gebruiken. Wanneer u de env-aanpak gebruikt die een PATH-zoekopdracht uitvoert, houdt u rekening met de voorkeur van de gebruiker en gebruikt u zijn voorkeursbash boven degene waarmee zijn systeem werd geleverd.


Antwoord 2, autoriteit 9%

Om het shell-script ‘file.sh’ te starten:

sh file.sh
bash file.sh

Een andere optie is het instellen van uitvoerbare toestemming met het chmod-commando:

chmod +x file.sh

Voer nu het .sh-bestand als volgt uit:

./file.sh

Antwoord 3, autoriteit 2%

Voor de bourne-schaal:

sh myscript.sh

Voor bash:

bash myscript.sh

Antwoord 4

Als u wilt dat het script in de huidige shell wordt uitgevoerd (u wilt bijvoorbeeld dat het uw directory of omgeving kan beïnvloeden), moet u zeggen:

. /path/to/script.sh

of

source /path/to/script.sh

Merk op dat /path/to/script.shrelatief kan zijn, bijvoorbeeld . bin/script.shvoert de script.shuit in de bindirectory onder de huidige directory.


Antwoord 5

Geef eerst toestemming voor uitvoering:-
chmod +x script_name

  1. Als het script niet uitvoerbaar is:-
    Voor het uitvoeren van sh-scriptbestand:-
    sh script_name
    Voor het uitvoeren van een bash-scriptbestand:-
    bash script_name
  2. Als het script uitvoerbaar is:-
    ./script_name

OPMERKING:-u kunt controleren of het bestand uitvoerbaar is of niet door ‘ls -a’ te gebruiken


Antwoord 6

De bestandsextensie .command is toegewezen aan Terminal.app. Dubbelklikken op een .command-bestand zal het uitvoeren.


Antwoord 7

Kleine toevoeging, om een tolk uit dezelfde map uit te voeren, waarbij nog steeds #!hashbangin scripts wordt gebruikt.

Als voorbeeldstaat een uitvoerbaar bestand van php7.2 gekopieerd van /usr/binin een map naast een hallo-script.

#!./php7.2
<?php
echo "Hello!"; 

Om het uit te voeren:

./hello

Die zich net zo gelijk gedragen als:

./php7.2 hello

De juiste oplossingen met goede documentatie kunnen de tools linuxdeployen/of appimage, dit gebruikt deze methode onder de motorkap.

Other episodes