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 hashbang
bevatten:
#! /usr/bin/env bash
De hashbang vertelt de kernel welk programma moet worden uitgevoerd (in dit geval wordt het commando /usr/bin/env
uitgevoerd 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 sh
en 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/bash
uitvoert om het script te interpreteren. Helaas wordt bash
niet 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 bash
schepen op verschillende locaties, zoals /usr/xpg/bin/bash
of /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 PATH
en 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 env
programma geïnstalleerd in /usr/bin
. Dus we starten env
met een hardgecodeerd pad, dat dan een PATH
zoekt naar bash
en 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 bash
als 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 -exu
naar dit schema te converteren. Je moet in plaats daarvan set -exu
plaatsen 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 bash
ergens anders. Dit is vaak het geval op OS X (Macs) waar Apple een verouderde /bin/bash
levert en gebruikers een up-to-date /usr/local/bin/bash
iets 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.sh
relatief kan zijn, bijvoorbeeld . bin/script.sh
voert de script.sh
uit in de bin
directory onder de huidige directory.
Antwoord 5
Geef eerst toestemming voor uitvoering:-
chmod +x script_name
- 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
- 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.