Kurzusok
/
Bash
Bash
/
Tanterv
/
Átirányítás
Át

Átirányítás ebben a kurzusban: Bash

{one: "1 feladat", other: "%{count} feladat"}

A(z) Átirányítás fogalomról

A parancssori felület világában a programok gyakran három szabványos adatfolyammal lépnek kapcsolatba:

  1. Szabványos bemenet (stdin): Ahol a program a bemenetét kapja (általában a billentyűzetről).
  2. Szabványos kimenet (stdout): Ahová a program a szokásos kimenetét küldi (általában a terminál képernyőjére).
  3. Szabványos hibakimenet (stderr): Ahová a program a hibaüzeneteket küldi (általában a terminál képernyőjére).

Emlékezz rá, hogy ezeket a csővezetékek és parancslisták fejezetben vezettük be.

Note

A csővezetékek az átirányítás egyik formájának tekinthetők: az egyik program szabványos kimenete közvetlenül egy másik program szabványos bemenetére kerül. A csővezetékeket már tárgyaltuk. Ez a fogalom a fájlokba és fájlokból történő átirányítással foglalkozik.

A shell-átirányítás egy hatékony mechanizmus, amellyel megváltoztathatod ezeknek a folyamoknak a célját. Ahelyett, hogy a program a billentyűzetről olvasna vagy a képernyőre írna, átirányíthatod a bemenetet egy fájlból, vagy elküldheted a kimenetet egy fájlba. Ez jelentős rugalmasságot és kontrollt ad afölött, hogyan érintkeznek a programok az adatokkal.

Fontos átirányító operátorok

Íme a leggyakoribb átirányító operátorok, és hogy mit tesznek:

> (Kimenet átirányítása)

  • Cél: Egy parancs szabványos kimenetének (stdout) átirányítása egy fájlba.

  • Viselkedés:

    • Ha a fájl nem létezik, létrejön.
    • Ha a fájl létezik, a tartalma felülíródik.
  • Példa:

    # Sends the output of 'ls -l' to 'file_listing.txt'
    ls -l > file_listing.txt
    
Caution

Az átirányítás a parancs végrehajtása előtt történik. Ez azt jelenti, hogy nem irányíthatsz át ugyanabba a fájlba, amelyből olvasnod kell.

date > date.txt         # populate the file with the current date
cat date.txt > date.txt # 'date.txt' is now empty!

A fenti példa második parancsában

  1. A Bash először csonkolja az átirányításban megnevezett fájlt. Ez megsemmisíti a korábbi tartalmat, és egy üres fájlt hagy maga után.
  2. Ezután a bash beolvassa az újonnan kiürült fájlt.
  3. Majd a bash visszaírja a tartalmat (azaz semmit) a fájlba.

>> (Kimenet hozzáfűzése)

  • Cél: Egy parancs szabványos kimenetének (stdout) hozzáfűzése egy fájlhoz.

  • Viselkedés:

    • Ha a fájl nem létezik, létrejön.
    • Ha a fájl létezik, a kimenet a fájl végére kerül.
  • Példa:

    # Adds "Another line" to the end of the file
    echo "Another line" >> file_listing.txt
    

< (Bemenet átirányítása)

  • Cél: Egy parancs szabványos bemenetének (stdin) átirányítása egy fájlból.

  • Viselkedés: A parancs a megadott fájlból olvassa a bemenetet a billentyűzet helyett.

  • Példa:

    # 'tr' reads from 'lowercase.txt' and
    # output is redirected to 'uppercase.txt'
    tr 'a-z' 'A-Z' < lowercase.txt > uppercase.txt
    

2> (Hiba átirányítása):

  • Cél: Egy parancs szabványos hibakimenetének (stderr) átirányítása egy fájlba.
  • Viselkedés: A hibaüzenetek a megadott fájlba kerülnek a terminál helyett.
  • Példa:
    # Error message from 'rm' is sent to 'error_log.txt'
    rm non_existent_file 2> error_log.txt
    

A szabványos hibakimenetet a 2>> segítségével is hozzáfűzheted egy fájlhoz.

További átirányítások

Vannak olyan átirányítások is, amelyek egyszerre tudják összevonni a stdin és a stderr folyamot. A részletekért lásd a kézikönyvet.

/dev/null

A /dev/null egy különleges fájl, amely

  • üres fájl, amikor olvasol belőle, és
  • elveti a beleírt összes adatot.

Néha „bitbucket” néven is emlegetik. Hasznos a kimenet vagy a hibák elnyomására.

some_command > /dev/null  # Discards stdout
some_command 2> /dev/null # Discards stderr

# Using /dev/null as input will prevent the command
# from reading data from the keyboard
some_command < /dev/null

Átirányítások kombinálása

Egyszerre több átirányítás is megadható.

some_command < input.txt > output.txt 2> error.txt

Egy átirányítás átmásolható.

# send stderr to the same destination as stdout
some_command > output.txt 2>&1

Amikor a 2>&1 kifejezést látod, olvasd úgy, hogy „irányítsd a stderr-t _oda, ahová a stdout éppen most mutat”. A Bash szigorúan balról jobbra dolgozza fel az átirányítási utasításokat, ami azt jelenti, hogy megteheted a következőt:

# redirect stdout to 'output1.txt'
# redirect stderr to the same place
# then change stdout to 'output2.txt'
some_command > output1.txt 2>&1 > output2.txt
Advanced

Fájlleírók

A shell-programozás és az olyan operációs rendszerek, mint a Linux/Unix összefüggésében a fájlleíró (FD) egy nemnegatív egész szám, amely egy nyitott fájl vagy egy I/O (bemenet/kimenet) erőforrás azonosítójaként vagy hivatkozásaként szolgál. Gondolj rá úgy, mint egy címkére vagy hivatkozási számra, amelyet az operációs rendszer a nyitott fájlok és adatfolyamok nyilvántartására használ.

Az átirányítások bal oldalán látható számok a fájlleírók.

A szabványos I/O folyamok kapják az első 3 fájlleírót:

  • a szabványos bemenet a 0-s FD
  • a szabványos kimenet az 1-es FD
  • a szabványos hibakimenet a 2-es FD

Új fájlleírókat az exec paranccsal és átirányító operátorokkal állíthatsz be vagy hozhatsz létre.

# create FD 3 as a copy of stdout
exec 3>&1
# send stdout to a log file
exec > log.txt

# then redirect both stdout and file descriptor 3
echo "some debug message" >&3  # displayed in the terminal
some_command  2>&1 # stdout and stderr send to 'log.txt'

Ez a technika meglehetősen bonyolultnak tűnik, de nagyon hasznos lehet olyan helyzetekben, amikor a szkriptedet egy másik szoftvercsomag futtatja, és a szabványos kimenetet a szoftver automatikusan elkapja. A bats parancs, amelyet ezen a kurzuson a unit tesztek futtatására használnak, így működik: a bats elkapja egy teszt stdout-ját és stderr-jét, de a 3-as FD-re küldött debug üzenetek megjelennek a terminálon.

Összefoglalva

Miért hasznos az átirányítás?

  • Kimenet mentése: A parancs eredményének eltárolása későbbi áttekintéshez vagy feldolgozáshoz.
  • Naplózás: Hibaüzenetek elkapása a hibakereséshez.
  • Automatizálás: Parancsok összefűzése úgy, hogy az egyik kimenete a másik bemenete legyen.
  • Szűrés: A nem kívánt kimenet elvetése.
  • Kötegelt feldolgozás: Adatok feldolgozása fájlokból a kézi begépelés helyett.
  • Szkriptírás: Az átirányítások elengedhetetlenek a robusztus shell-szkriptek írásához.

A shell-átirányítások részletes kontrollt adnak afölött, hogyan érintkeznek a programok az adatokkal, lehetővé téve összetett munkafolyamatok felépítését és az információk hatékony kezelését.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg