Átirányítás (számítástechnika) - Redirection (computing)

Image
A szabványos adatfolyamok bemenetre, kimenetre és hibára

A számítástechnika , az átirányítás egy formája közötti kommunikációt , és a funkció a legtöbb parancssori tolmácsok , beleértve a különböző Unix kagyló , melyek képesek megváltoztatni szabvány patakok a felhasználó által megadott helyeken.

A Unix-szerű operációs rendszerek, programok csinálni átirányítás a dup2 (2) rendszer hívás , vagy kevésbé rugalmas, de magasabb szintű stdio analógok, freopen (3) és popen (3) .

Szabványos bemenet és szabványos kimenet átirányítása

Az átirányítást általában úgy hajtják végre, hogy bizonyos karaktereket helyeznek el a parancsok között .

Alapvető

Általában ezeknek a karaktereknek a szintaxisa a következő, a <bemenet átirányítására és >a kimenet átirányítására szolgál. command > file1végrehajtja Command1 helyezve a termelés fájl1 , szemben megjelenítésére azt a terminál, amely a szokásos úti cél a szabványos kimenetre. Ez letörli a fájl1 meglévő adatait .

Az command < file1executes parancs1 használata , a fájl1 a bemeneti forrás, szemben a billentyűzettel , amely a szokásos bemeneti forrás.

command < infile > outfileegyesíti a két képességek: parancs1 olvas infile és ír outfile

Változatok

Ahhoz, hogy a kimenetet hozzáfűzi a végén a fájl, hanem felülírja azt az >>operátort használjuk: command1 >> file1.

Egy folyam literálból (egy soros fájlból, amelyet a szabványos bemenethez továbbítottak) olvasni, használhat egy itt található dokumentumot , az <<operátor segítségével:

$ tr a-z A-Z << END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES

Egy karakterláncból való olvasáshoz használhat egy here karakterláncot a következő <<<operátor használatával :, vagy: tr a-z A-Z <<< "one two three"

$ NUMBERS="one two three"
$ tr a-z A-Z <<< "$NUMBERS"
ONE TWO THREE

Csővezeték

Image
Három programból álló folyamat fut egy szöveges terminálon

A programokat úgy lehet futtatni, hogy az egyik program kiolvassa a kimenetet a másikból anélkül, hogy explicit köztes fájlra lenne szükség. végrehajtja a command1 parancsot , annak kimenetét használja a parancs2 bemeneteként (általában csővezetéknek nevezik , a " " karakter "pipe" néven ismert). command1 | command2|

A parancsokat végrehajtó két program futhat párhuzamosan az egyetlen tárolóhellyel, amely működő pufferek (a Linux legfeljebb 64 ezer puffert enged meg), valamint az egyes parancsok feldolgozásához szükséges munkaterületet. Például a "rendezés" parancs nem tud kimenetet előállítani, amíg az összes bemeneti rekordot el nem olvasta, mivel a legutolsó beérkezett rekord rendezett sorrendben az első lehet. Dr. Alexia Massalin kísérleti operációs rendszere, a Synthesis az egyes feladatok prioritását a be- és kimeneti pufferek teljessége szerint módosította.

Ez ugyanazt a végeredményt eredményezi, mint két átirányítás és egy ideiglenes fájl használata, például:

$ command1 > tempfile
$ command2 < tempfile
$ rm tempfile

De itt a parancs2 nem kezdi el a végrehajtást, amíg a parancs1 nem fejeződik be, és kellően nagy karcolófájl szükséges a köztes eredmények, valamint az egyes feladatokhoz szükséges munkaterületek tárolásához. Például, bár a DOS lehetővé teszi a "cső" szintaxist, ezt a második megközelítést alkalmazza. Tehát tegyük fel, hogy egy hosszú ideig futó "Worker" program különböző üzeneteket állít elő működés közben, és hogy egy második program, a TimeStamp minden rekordot lemásol az stdin- ről az stdout-ra , amelyet a rendszer dátuma és ideje tartalmaz a rekord fogadásakor. Egy olyan sorozat, amely csak akkor mutat időbélyegeket, amikor a Worker befejezte, pusztán azt mutatja, hogy a kimeneti fájl milyen gyorsan olvasható és írható. Worker | TimeStamp > LogFile.txt

A parancscsatolás jó példája a kombináció echoegy másik paranccsal, hogy interaktív dolgokat érjünk el egy nem interaktív héjban, pl . Ez futtatja az ftp ügyfelet a bemeneti felhasználóval , nyomja meg a return gombot , majd adja át . echo -e 'user\npass' | ftp localhost

Alkalmi használat esetén a folyamat kezdeti lépése gyakran catvagy echofájlból vagy karakterláncból történő olvasás. Ezt gyakran helyettesítheti bemeneti irányítás vagy egy here karakterlánc , és a macska és csővezeték használatát a bemeneti átirányítás helyett a haszontalan macskahasználatnak nevezik . Például a következő parancsokat:

$ cat infile | command
$ echo $string | command
$ echo -e 'user\npass' | ftp localhost

helyettesíthető:

$ command < infile
$ command <<< $string
$ ftp localhost <<< $'user\npass'

Mint echogyakran egy shell-beli parancs, használatát nem kritizálják annyira, mint a cat, ami egy külső parancs.

Átirányítás a szabványos fájlfogantyúkra és onnan

Az eredeti Bourne héjból származó Unix shell -ekben az első két művelet tovább módosítható úgy, hogy közvetlenül a karakter elé helyezünk egy számot (a fájlleírót ) ; ez befolyásolja, hogy melyik folyamot használják az átirányításhoz. A Unix szabványos I/O adatfolyamai a következők:

Fogantyú Név Leírás
0 stdin Standard bemenet
1 stdout Standard kimenet
2 stderr Standard hiba

Például végrehajtja a parancsot , és a szabványos hibafolyamot a file1 -be irányítja . command 2> file1

A csh -ből (a C shell ) származó héjakban a szintaxis az & (ampersand) karaktert fűzi az átirányítási karakterekhez, így hasonló eredményt ér el. Ennek az az oka, hogy megkülönböztetni a fájl neve „1” és stdout, azaz vs . Az első esetben az stderr átirányításra kerül az ' 1 ' nevű fájlba , a másodikban az stderr pedig az stdout -ba. cat file 2>1cat file 2>&1

Egy másik hasznos lehetőség az egyik szabványos fájlkezelő átirányítása egy másikra. A legnépszerűbb változat az, hogy egyesíti standard hiba a standard kimenetre , így hibaüzenetek lehet feldolgozni együtt (vagy felváltva) a szokásos kimenetet. Például megpróbálja megtalálni az összes .profile nevű fájlt . Átirányítás nélkül végrehajtva lekéréseket ad ki az stdout -nak, és hibákat (pl. Jogosultság hiányában a védett könyvtárak bejárásához) az stderr -nek . Ha a szabványos kimenet arra irányul, hogy a fájl eredményeket , hibaüzenet jelenik meg a konzolon. Ha látni szeretné a találatokat és a hibaüzeneteket a fájlok eredményeiben , akkor egyesítse a stderr (2. fogantyú) stdout (1. kezelő) paranccsal . find / -name .profile > results 2>&12>&1

Ha az egyesített kimenetet egy másik programba kívánja csatlakoztatni, a fájl egyesítési sorrendjének meg 2>&1kell előznie a cső szimbólumát, ígyfind / -name .profile 2>&1 | less

A parancs egyszerűsített, de a POSIX-nak nem megfelelő formája (nem érhető el a Bourne Shell-ben a 4. verzió előtti utolsó verzió előtt, vagy a Debian/Ubuntuban használt szabványos Debian Almquist shellben ): vagy . command > file 2>&1command &>filecommand >&file

Lehet használni 2>&1a " >" előtt, de az eredményt általában félreértik. A szabály az, hogy minden átirányítás függetlenül állítja be a fogantyút a kimeneti adatfolyamhoz. Tehát a " 2>&1" beállítja a fogantyút 2arra, amire a fogantyú 1mutat, ami általában stdout . Akkor „ >” átirányítást kezeli 1valami mást, például egy fájlt, de ez nem változik fogantyú 2, amely még pontot stdout .

A következő példában, a szabványos kimenet van írva, hogy a fájl , de a hibák irányítják stderr stdout, azaz a képernyőn jelenik meg: . command 2>&1 > file

Ahhoz, hogy a hibákat és a standard kimenetet is fájlba írhassa , a sorrendet meg kell fordítani. Szokásos kimeneti először átirányítja a fájlt, majd stderr lenne emellett a rendszer átirányítja a stdout fogantyú, amely már változott pont a fájlt: . command > file 2>&1

Láncolt csővezetékek

Az átirányítás és a csővezeték -jelzők összekapcsolhatók összetett parancsok létrehozásához. Például az infile sorait lexikográfiai sorrendbe rendezi , egyedi sorokat ír elő az előfordulás számával, az eredményül kapott kimenetet numerikusan rendezi, és a végső kimenetet a kimeneti fájlba helyezi . Ezt a konstrukciót nagyon gyakran használják shell parancsfájlokban és kötegelt fájlokban . sort infile | uniq -c | sort -n > outfile

Átirányítás több kimenetre

A szabványos parancs tee lehet átirányítani kimenet egy parancs több célállomásra: . Ez a fájllista kimenetét a szabványos kimenetre és az xyz fájlra irányítja . ls -lrt | tee xyz

Lásd még

Külső linkek