Hvad er det, du kører? Linux-programmer, scripts, indbyggede funktioner, funktioner og aliaser

Når du kører en Linux-kommando, kan forskellige handlinger finde sted alt efter kommandoens type, herunder eksekverbare filer, shell-scripts, indbyggede kommandoer, funktioner og aliaser.
Hvad sker der, når du kører en Linux-kommando? Denne enkle handling kan synes ligetil, men mange forskellige ting kan faktisk ske, afhængigt af om du kører et eksekverbart program, et shell-script, en shell indbygget kommando, en brugerdefineret funktion eller et alias.
De forskellige typer af Linux-kommandoer
Et program (binær eller eksekverbar) er en fil på disk et sted, i et anerkendt format. Almindelige formater inkluderer ELF på Linux og Mach-O på Mac. Formatet er et lavniveau, maskinevenligt ét, som shellen kan videregive til kernen for at køre.
Et shell-script er en meget højere niveau form for program, skrevet i menneskelæselig tekst. Et shell-script kan køre andre kommandoer, og det kan være skrevet i et tolket sprog som Perl eller Python.
En indbygget kommando er intern i shellen, så den er altid tilgængelig og kører generelt på lavt niveau for at udføre operationer, der direkte påvirker shellen selv.
En shell funktion er som et mini shell-script, der pakker et sæt kommandoer sammen under ét navn. Shell-funktioner indlæses normalt, så de altid er tilgængelige efter navn.
Et alias er et alternativt navn for nogen af ovenstående. Du kan oprette et kort alias for en længere kommando for at spare tid og kræfter, når du kører almindelige opgaver.
Rækkefølgen, hvori en shell som bash leder efter disse typer kommandoer, er vigtig. For at sige det enkelt, prøver bash kommandoer i denne rækkefølge: alias, funktion, indbygget, program/script.
1 Køre et eksekverbart program
Den mest kendte type kommando er en eksekverbar programfil. Mange af de mest almindelige programmer er en del af POSIX-standarden, hvilket betyder, at de burde være tilgængelige på de fleste Unix- eller Unix-lignende systemer, herunder Linux og macOS. Eksempler på sådanne kommandoer inkluderer cat, diff og vi.
Andre kommandolinjeprogrammer—som Apache, Neofetch eller tree—skal muligvis installeres, fordi de typisk ikke er inkluderet i en distribution som standard. Men ligesom POSIX-kommandoer vil de køre via en enkelt programfil et sted på din disk.
Der er to almindelige måder at køre et program på. Først kan du skrive en sti til en programfil, som ./myprog eller /usr/bin/awk. Hvis den første del af din kommando indeholder fremadskråstreg, vil shellen forsøge at finde en fil på den tilsvarende sti. For eksempel kan du køre et program ved /bin/cat sådan her:
/bin/cat myfileShellen vil derefter kontrollere for et eksekverbart program ved /bin/cat og køre det, hvis det findes.
På Linux har eksekverbare programmer normalt ikke en filendelse, så en kommando som “grep” er indeholdt i en fil, der hedder grep. Dette er bare en konvention, fordi det er praktisk at gøre eksekverbare genkendelige kun ud fra filnavnet. Men hvis du virkelig ønsker det, har du frihed til at navngive dine eksekverbare programmer hvad du vil, såsom “myprog.exe” eller “myprog.RUNME.”
Det andet tilfælde forekommer, når du skriver et programnavn uden en sti; for eksempel:
cat myfileMed et system, der er korrekt opsat, burde dette have samme effekt som før, fordi shellen vil finde det samme cat-program. Det gør den ved at kontrollere en særlig miljøvariabel ved navn PATH, som ser sådan ud:
Dette er en kolon-separeret liste over stier, som shellen vil søge i for at finde et program. Rækkefølgen er vigtig, da du kan have to filer med samme navn i forskellige placeringer. For eksempel, hvis du har en /usr/bin/grep fil og en /bin/grep fil, vil den ovenstående PATH få shellen til at køre /usr/bin-versionen. Dette system lader dig tilsidesætte en systemomfattende kommando med en brugerdefineret, som er mere specifik for dine behov, hvilket kan være meget nyttigt.
2 Køre et shell-script
Et shell-script kører lidt anderledes end et eksekverbart program, og det er en meget anderledes type fil. Et simpelt shell-script ser sådan ud:
#!/bin/sh
echo Bare et simpelt, meningsløst shell-scriptDen første linje kaldes en “shebang” eller “hash-bang” linje, navngivet efter kombinationen af # og ! tegn. Dette er en særlig instruktion, der fortæller shellen, hvilken fortolker der skal bruges til resten af scriptet. I ovenstående tilfælde er det shellen selv.
/bin/sh.
Resten af scriptet er et tekstprogram, som fortolkeren forstår. I dette tilfælde kan shellen køre kommandoer som echo på samme måde, som hvis du havde skrevet dem på kommandolinjen.
Ellers er et shellscript meget lig et eksekverbart program, og din shell vil søge efter det ved hjælp af PATH-variablen på samme måde. For både programmer og shellscripts er det vigtigt at bemærke, at rettighederne på den tilsvarende fil vil påvirke, hvordan du kører det. Med execute-rettigheden indstillet kan du køre programmet ved at skrive dets navn eller sti. Men hvis execute-rettigheden ikke er indstillet, vil du se en fejl:
Du kan altid køre en sådan fil ved at videregive dens navn som et argument til en passende fortolker. For eksempel kan du køre et shellscript således:
sh myscript.shDu kan endda køre en eksekverbar på denne måde, men du skal udføre nogle undersøgelser først. Filkommandoen giver information om filtypen, herunder dens fortolker:
I dette tilfælde kan du køre pwd-binæren ved hjælp af /lib/ld-linux-aarch64.so.1-programmet:
3 Eksekvering af en Shell Builtin
Nogle kommandoer er så grundlæggende for shellens natur, at de skal fungere på en lidt anden måde. Disse kaldes builtins, fordi de i realiteten er en del af shellen selv.
Builtins er som regel lavniveau og kommandoer, som du bruger ofte: cd, echo og kill er almindelige eksempler. I modsætning til programmer og shellscripts svarer disse kommandoer ikke til en bestemt fil, fordi de er en del af shellen selv, kompileret ind i shellens eksekverbare.
Nogle systemer kan inkludere wrapper-scripts, der kører builtins. For eksempel er der på mit macOS-system et /usr/bin/cd script, som bruger builtin kommandoen til at køre den tilsvarende builtin. Dette er for POSIX-kompatibilitet, og du kan sikkert ignorere scriptversionen.
Builtins kan være svære at lære om, fordi de enten ikke har nogen manual-indgang (f.eks. på Ubuntu Linux), eller de alle har én stor, fælles manualside (macOS). tldr programmet er en fantastisk måde at finde mere information om builtins.
Af lignende årsager understøtter builtins normalt langt færre kommandolinjeindstillinger end fuldt udviklede programmer. For eksempel vil cd normalt kun støtte to, relativt obskure indstillinger: -L (for at følge symbolske links) og -P (for at undgå symbolske links). Dette betyder, at valgmuligheder som -h eller --help desværre ikke understøttes.
4 Opkald af en Shell Funktion
En kommando kan også være et opkald til en funktion. På ethvert tidspunkt under en session kan du indlæse eller definere en funktion ved hjælp af denne syntaks (i bash):
function_name() {
commands
}Alternativt kan du bruge en syntaks, der indsætter nøgleordet “function” før et funktionsnavn og udelader parenteserne efter det:
function function_name {
commands
}Du kan derefter kalde en funktion ved at skrive dens navn efterfulgt af eventuelle argumenter. For eksempel har jeg følgende hjælpfunktion defineret i en fil:
mkd () {
mkdir -p "$@"
cd "$@" || exit
}Jeg indlæser derefter denne fil fra min shells kørselkontrol script (~/.zshrc), og jeg kan køre denne kommando for at oprette et nyt bibliotek og straks skifte til det:
mkd new_dirDu kan kalde en sådan funktion på kommandolinjen når som helst du vil. Du kan også kalde det fra scripts, men husk at det skal indlæses (brug den indbyggede source, eller dens ækvivalent ., for at gøre det).
5 Brug af en Alias
En alias er en bekvemmelighed, der sparer dig for at skrive lange kommando-navne eller almindelige indstillinger. For eksempel har jeg på mit system en alias for at sikre, at fil-listninger er i farver, med type suffikser:
ls='ls -GF'Nu, hvis jeg blot skriver “ls,” kører kommandoen “ls -GF” i stedet.
Du kan oprette en alias på ethvert tidspunkt ved at bruge den indbyggede alias-kommando, f.eks.
alias ls="ls -GF"Bemærk, at citater er nødvendige, når du kører alias, hvis erstatningsstrengen indeholder nogle mellemrum. Du kan se alle alias ved at køre alias, og du kan fjerne en alias med.
kommandoen unalias. Igen skal du tilføje aliaser til en opstartfil, som ~/.zshrc eller ~/.bashrc, hvis du vil have dem til at gælde på tværs af sessioner.

Skriv et svar