Opdrachten uitvoeren vanuit een Shell-script

How Execute Commands From Within Shell Script



In bash kan het uitvoeren van commando's vanuit een shellscript in het begin een beetje intimiderend zijn en kan een sprong in het diepe vereisen. Commando's die binnen een bash-script worden uitgevoerd, zijn immers niet interactief. Hier zullen we de basis leggen om commando's uit te voeren vanuit een shellscript en de volgende vragen over commando's beantwoorden: Waar komen ze vandaan? Wat zijn ze? Hoe gebruiken we ze in een script?

Waar komen commando's vandaan?

Commando's in bash komen uit een van de volgende categorieën:







Bash zelf (zie ingebouwde elementen)

Bash wordt geleverd met zijn eigen set opdrachten om toegang te geven tot de ingebouwde functies, zoals het declareren van arrays, het lezen van regels uit een bestand en andere functies die zijn ingebouwd in bash. We noemen commando's van deze categorie bash ingebouwde commando's, of kortweg ingebouwd.



Uitvoerbare bestanden in uw omgeving (zie externe opdrachten)

Standaard neemt bash bepaalde variabelen over. Dit wordt waargenomen in het geval van de variabele PATH, inclusief locaties voor uitvoerbare bestanden waarnaar in bash wordt verwezen als externe opdrachten. Dat wil zeggen, als de Krul commando in uw pad staat, kan het worden uitgevoerd vanuit een bash-script op dezelfde manier als in de interactieve modus. We noemen commando's van deze categorie, externe commando's, of kortweg commando's.



Door de gebruiker gedefinieerde functie (zie functies)

Voordat externe commando's en ingebouwde functies worden uitgevoerd, controleert bash of een functie is gedefinieerd. Als dit het geval is, wordt de functie uitgevoerd als een opdracht. Als dit niet het geval is, gaat het verder in de volgorde van prioriteit voor opdrachten. Om een ​​functie uit te voeren die buiten een script is gedefinieerd, moeten ze worden gedeclareerd met het -x attribuut; anders kunnen ze worden opgenomen met behulp van de . Opdracht. We noemen commando's van deze categorie gebruikersgedefinieerde functies of kortweg functies.





Wat zijn commando's?

Een commando is elk woord dat moet worden behandeld als een enkel toegangspunt van een programma binnen de shell-omgeving. In het geval dat de opdracht wordt uitgevoerd, worden de opdracht zelf en optionele argumenten doorgegeven als positionele parameters, ${0}, ${1}, ${2}, ... De nulde positionele parameter (${0}) geeft de commando zelf en is ongewijzigd in context. Dat wil zeggen, in tegenstelling tot positionele parameters in functies, ${1}, ${2}, ... die kunnen veranderen afhankelijk van de context, is ${0} ongewijzigd tussen functieaanroepen.

Commando's hebben een bereik afhankelijk van de locatie van declaratie en attributen die zijn toegewezen als globaal, ingebouwd in bash of lokaal aan uw bash-programma.



Hier is een lijst met opdrachttypen die u moet kennen.

Ingebouwde opdrachten

Dit zijn eersteklas burgers van het bash-universum, inclusief karakters zoals '.' ':' '[' ']' en gereserveerde woorden zoals declare in bash . Je rekent erop dat deze commando's, opgenomen in de lijst met ingebouwde bash-commando's, beschikbaar zijn voor gebruik in je bash-script.

Afhankelijk van de aanduiding en het versienummer van uw bash-interpreter zijn sommige opdrachten mogelijk niet beschikbaar.

Externe opdrachten

Externe opdrachten zijn uitvoerbare bestanden die toegankelijk zijn buiten een bash-script zoals curl. In tegenstelling tot functies worden externe opdrachten niet als variabelen opgeslagen.

Hoe lager de prioriteit van een opdrachttype, hoe later de opdracht kan worden geïnterpreteerd. Externe opdrachten hebben de laagste prioriteit in bash. Dat wil zeggen, voordat een extern commando wordt uitgevoerd, zal de interpreter bash naar functies zoeken, dan naar ingebouwde functies en ten slotte proberen te zien of er extern een commando bestaat. Zo niet, dan zou u de volgende fout moeten zien.

bash: onbekend-commando:opdrachtniet gevonden

In een bash-script kunnen functies het gedrag van externe opdrachten overschrijven als ze dezelfde naam delen, zoals we eerder hebben gezien in curl bash-voorbeelden. Een voorbeeld van een aangepaste externe opdracht die een functie gebruikt, volgt.

Krul() {
opdracht ${FUNCNAME}...
}

Dit werkt omdat functies een hogere prioriteit hebben dan externe opdrachten en zelfs ingebouwde bash. De beperking is de toegestane tekens in een functienaam.

Merk op dat het bovenstaande voorbeeld als volgt kan worden bereikt door een alias te gebruiken.

alias Krul= ’
{
Krul ...
}
'

In het geval van aliassen kan het type commando verschillen, afhankelijk van de context die wordt uitgevoerd, terwijl in het geval van de aangepaste externe commando's die de functiemethode gebruiken, het ingangspunt altijd een functie is.

Functies

Functies regel in bash. Alvorens naar ingebouwde en externe commando's te kijken, controleert bash of een functie gedefinieerd is door een kandidaat-functienaam, het eerste woord dat op een regel verschijnt of na de ; teken dat het einde van een opdrachtregel aangeeft. De enige uitzondering zijn bash-variabelen die in hoofdletters zijn geschreven, zoals ${FUNCNAME}.

alias() { FUNCNAME=asdf ;gooide uit $ {@ ,,};}
alias Krul='TEST KRUL ALIAS' #?

Eenvoudige opdrachten

Eenvoudige commando's worden in de bash man-pagina's gedefinieerd als een woord gevolgd door optionele argumenten. In de context kan een eenvoudige opdracht een ingebouwde, externe opdracht of functie zijn.

Commando's uitvoeren vanuit een bash-script

Nu we weten welke soorten commando's beschikbaar zijn, kunnen we uitbreiden naar het gebruik ervan in uw scripts. Eerst moeten we weten hoe de opdrachtvoorrang werkt in bash.

Hier zijn enkele manieren om de prioriteit in een bash-script te regelen.

Laat bash beslissen

opdrachtnaam

Voor het grootste deel, vooral in het begin, laten we bash gewoon beslissen welk commando te gebruiken. Er zijn echter gevallen waarin uw bedoeling door bash mogelijk niet correct wordt geïnterpreteerd. Dat is het geval wanneer functienamen en externe commando's of ingebouwde onderdelen elkaar overlappen.

Een externe opdracht uitvoeren

opdrachtopdrachtnaam

Stel dat er een extern commando command_name is dat beschikbaar is in de interactieve modus en dat je het in een bash-script wilt gebruiken. We kunnen bash expliciet vertellen dat command_name een externe opdracht is met behulp van de ingebouwde opdracht.

Voorbeelden van externe opdrachten

Voorbeelden van externe opdrachten, ervan uitgaande dat het volgende is geïnstalleerd:

het dossier
Gaan
vijgje
Voorbeeld: bestandstype en info ophalen
{ # bestandstype en info ophalen
het dossier ${infile} # (1,2)
}
# (1) opdracht, bestand
# (2) infile={Pad naar bestand}
Voorbeeld: Stage gewijzigde en nieuwe bestanden in git
{ # stage-bestanden in git
git add.# (1)
}
# (1) commando, git
Voorbeeld: maak ascii-kunst met figlet
{ # maak ascii-kunst
vijgje${bericht} # (1,2)
}
# (1) commando, figlet
# (2) message={Bericht om weer te geven als ascii art}

Een ingebouwde opdracht uitvoeren

ingebouwdopdrachtnaam

Stel dat command_name een van de commando's is die is gedefinieerd als een ingebouwde bash. Om bash te laten weten dat we command_name willen uitvoeren als een ingebouwde, gebruiken we de ingebouwde ingebouwde.

Voorbeelden van ingebouwde opdrachten
Voorbeeld: Hoeveel ingebouwde?
ingebouwd{,}{,,}{,,,} # hoeveel ingebouwde?
Voorbeeld: Phantom declareren
{
verklaren() { gooide uitoeps!;}
verklaren–xfverklaren #?
}

Conclusie

Het is vrij eenvoudig om een ​​opdracht uit te voeren vanuit een bash-shellscript. Er zijn drie hoofdcommandotypes. Weten hoe eenvoudige opdrachten in bash worden geïnterpreteerd, kan leiden tot verbeterde controle over welk type opdracht in runtime wordt uitgevoerd.