A parancssori felület világában a programok gyakran három szabványos adatfolyammal lépnek kapcsolatba:
stdin): Ahol a program a bemenetét kapja (általában a billentyűzetről).stdout): Ahová a program a szokásos kimenetét küldi (általában a terminál képernyőjére).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.
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.
Í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:
Példa:
# Sends the output of 'ls -l' to 'file_listing.txt'
ls -l > file_listing.txt
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
>> (Kimenet hozzáfűzése)Cél: Egy parancs szabványos kimenetének (stdout) hozzáfűzése egy fájlhoz.
Viselkedés:
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):stderr) átirányítása egy fájlba.# 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.
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/nullA /dev/null egy különleges fájl, amely
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
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
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:
Ú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.
Miért hasznos az átirányítás?
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.