Input Output Redirection i Linux/Unix-exempel

⚡ Smart sammanfattning

Omdirigering i Linux och Unix ändras där ett kommando läser indata eller skickar utdata, swapping tangentbordet och skärmen för filer eller enheter med hjälp av operatorer som större än-tecknet, mindre än-tecknet och tilläggsoperatorn.

  • 🔀 Omdirigering: Omdirigering ändrar ett kommandos standardinmatning eller -utmatning från tangentbordet och skärmen till en fil eller enhet.
  • ➡️ Produktion: Operatorn > skriver utdata till en fil, medan >> lägger till i en befintlig fil utan att radera den.
  • ⬅️ Ingång: Operatorn < matar in en fil i ett kommando som standardinmatning istället för tangentbordet.
  • 🔢 Filbeskrivningar: Varje öppen fil får ett nummer: 0 för stdin, 1 för stdout och 2 för stderr.
  • ⚠️ Felomdirigering: Om du använder 2> skickas felmeddelanden till en separat fil så att de inte stör den normala utdata.
  • 🔗 Kombinerade strömmar: Syntaxen 2>&1 dirigerar standardfelet till samma mål som standardutdata.
  • 🤖 AI-hjälp: AI-assistenter och GitHub Copilot kan bygga och förklara omdirigeringskommandon och skalskript.

Omdirigering av in- och utdata i Linux och Unix med exempel

Omdirigering är en av de mest användbara funktionerna i Linux och Unix-shell, eftersom det låter dig bestämma vart ett kommando läser sin indata och skickar sin utdata. Den här sidan förklarar utdata, indata och felomdirigering med fungerande exempel.

Vad är omdirigering?

Omdirigering är en funktion i Linux som gör att man kan ändra standardinmatnings- och utmatningsenheter när man kör ett kommando. Det grundläggande arbetsflödet för alla Linux kommando är att den tar en ingång och ger en utgång.

  • Standardingångsenheten (stdin) är tangentbordet.
  • Standardutgångsenheten (stdout) är skärmen.

Med omdirigering kan standardindata och -utdata ovan ändras.

Omdirigering av utdata

Grafiken nedan markerar början på exemplen på omdirigering av utdata.

Grafik för rubrik för omdirigering av utdata

Symbolen '>' används för omdirigering av utdata (STDOUT).

Exempel:

ls -al > listings

Här omdirigeras utdata från kommandot ls -al till filen "listings" istället för din skärm. Skärmdumpen nedan visar resultatet.

Terminal som visar ls -al-listan omdirigerad till listningsfilen

Obs: Använd rätt filnamn när du omdirigerar kommandoutdata till en fil. Om en fil med samma namn redan finns, tar det omdirigerade kommandot bort dess innehåll och skriver sedan över det.

Om du inte vill att en fil ska skrivas över men vill lägga till mer innehåll i en befintlig fil, använd operatorn '>>'. Skärmdumpen nedan visar innehåll tillagt med '>>'.

Terminal som visar kommandoutdata tillagd till en befintlig fil med den dubbla större-än-operatorn

Du kan omdirigera standardutdata inte bara till filer, utan även till enheter.

$ cat music.mp3 > /dev/audio

Kommandot cat läser filen music.mp3 och skickar utdata till /dev/audio, vilket är ljudenheten. Om ljudkonfigurationen på din dator är korrekt spelar det här kommandot upp filen music.mp3.

Ingångsomdirigering

Grafiken nedan introducerar omdirigering av indata.

Grafik för rubrik för omdirigering av inmatning

Symbolen '<' används för omdirigering av indata (STDIN).

Exempel: E-postprogrammet i Linux kan hjälpa dig att skicka e-postmeddelanden från terminalen.

Du kan skriva innehållet i e-postmeddelandet med hjälp av tangentbordet, standardinmatningsenheten. Men om du vill bifoga en fil till e-postmeddelandet kan du använda omdirigeringsoperatorn för inmatning i följande format.

mail -s "Subject" to-address < Filename

Skärmdumpen nedan visar mail-kommandot som läser en fil som indata.

mail-kommando med omdirigering av indata för att bifoga en fil till ett e-postmeddelande

Detta bifogar filen till e-postmeddelandet och den skickas till mottagaren.

Exemplen ovan var enkla. Titta nu på några avancerade omdirigeringstekniker som använder filbeskrivningar.

Fil Descriptors (FD)

I Linux och Unix är allting en fil. Vanliga filer, kataloger och även enheter är filer. Varje fil har ett associerat nummer som kallas en fildeskriptor (FD).

Diagrammet nedan visar standardströmmarna och deras filbeskrivningar.

Diagram över standardingångs-, utgångs- och felströmmar och deras filbeskrivningar

Din skärm har också en fildeskriptor. När ett program körs skickas utdata till skärmens fildeskriptor, och du ser programutdata på din bildskärm. Om utdata skickades till skrivarens fildeskriptor skulle programutdata skrivas ut.

Fel omdirigering

När du kör ett program eller kommando i terminalen är tre filer alltid öppna, nämligen standardindata, standardutdata och standardfel.

Dessa filer finns alltid när ett program körs. Som förklarats tidigare är en filbeskrivning associerad med var och en av dessa filer.

Fil Fil Descriptor
Standardingång STDIN 0
Standardutgång STDOUT 1
Standardfel STDERR 2

Som standard visas felströmmen på skärmen. Omdirigering av fel dirigerar felen till en annan fil än skärmen.

Varför felomdirigering?

Felomdirigering är en av de mycket populära funktionerna i Unix och Linux.

De som använder Unix regelbundet vet att många kommandon ger enorma mängder fel. Till exempel, när man söker efter filer får man vanligtvis tillstånd nekade fel, vilket vanligtvis inte hjälper personen som söker efter en viss fil. När man kör shell-skript vill man ofta inte att felmeddelanden ska störa den normala programutdatan.

Lösningen är att omdirigera felmeddelandena till en fil.

Exempelvis 1

$ myprogram 2>errorsfile

Skärmdumpen nedan visar detta kommando i terminalen.

Terminal som kör mittprogram med standardfel omdirigerad till errorsfile-filen

Ovan kör vi ett program som heter mittprogram. Filbeskrivningen för standardfel är 2. Med hjälp av "2>" omdirigerar vi felutdata till en fil med namnet "felfil". Således är programutdata inte belamrad med fel.

Exempelvis 2

Här är ett annat exempel som använder find-satsen.

find . -name 'my*' 2>error.log

Med hjälp av kommandot find söker vi i den aktuella katalogen ”.” efter en fil vars namn börjar med ”my” och skickar eventuella fel till error.log.

Exempel 3: Låt oss titta på ett mer komplext exempel.

Serveradministratörer listar ofta kataloger och lagrar både fel- och standardutdata i en fil, som kan bearbetas senare. Här är kommandot.

ls Documents ABC> dirlist 2>&1

Diagrammet nedan visar båda strömmarna som samlas in i en fil.

Diagram över standardutdata och standardfel, båda omdirigerade till filen dirlist

Här:

  • 2>&1 betyder att STDERR omdirigeras till samma mål som STDOUT (vilket är filens dirlist).
  • Felutdata omdirigeras till standardutdata, som i sin tur omdirigeras till filen dirlist. Därför skrivs båda strömmarna till filen dirlist.

Diagrammet nedan sammanfattar hur indata, utdata och felomdirigering hänger ihop.

Diagram som sammanfattar inmatning, utmatning och felomdirigering i Linux och Unix

Vanliga frågor

A Röret (|) skickar utdata från ett kommando direkt till ett annat kommando som indata. Omdirigering kopplar istället ett kommando till en fil eller enhet, skriver utdata till den eller läser indata från den. Pipes joinar kommandon; omdirigering kopplar ett kommando till en fil.

Operatorn > skriver ett kommandos utdata till en fil och ersätter befintligt innehåll. Operatorn >> lägger istället till utdata i slutet av filen, keeping det som redan finns där. Använd >> när du vill lägga till i en fil istället för att skriva över den.

/dev/null är en speciell fil som kasserar allt som skrivits till den. Om du lägger till 2>/dev/null till ett kommando omdirigeras dess felmeddelanden till den filen och kasseras tyst så att endast normal utdata visas på skärmen. Det är ett vanligt sätt att dölja oönskat felmeddelanden.

Kommandot tee läser från standardindata och skriver data till både skärmen och en eller flera filer samtidigt, till exempel ls -al | tee listing.txt. Det låter dig spara ett kommandos utdata till en fil medan du fortfarande visar det på skärmen.

Ett here-dokument använder operatorn << för att mata in flera rader inbäddad text i ett kommando som indata, och slutar med ett markeringsord du väljer. Det är praktiskt i shellskript för att skicka inmatning med flera rader, till exempel en e-postmeddelandetext, utan en separat fil.

Använd syntaxen 2>&1 efter omdirigering av utdata, som i command > file 2>&1, så att standardfelet följer standardutdata in i filen. I moderna Bash gör förkortningen command &> file samma sak. Ordningen spelar roll: placera 2>&1 efter omdirigeringen av utdata.

AI-assistenter kan omvandla en begäran på vanlig engelska till rätt omdirigeringskommando, förklara vad operatorer som 2>&1 eller &> gör och flagga misstag innan du kör dem. Maskininlärningsverktyg skannar också omdirigerade logg- och felfiler för att upptäcka avvikelser som manuell granskning skulle missa.

Ja. GitHub Copilot kan generera kommandon och skript som omdirigerar inmatning, utmatning och fel från en kort kommentar som beskriver målet, och slutföra dem medan du skriver. Revvisa alla föreslagna kommandon mot dina filer, särskilt de som använder > och som skriver över befintlig data.

Sammanfatta detta inlägg med: