Átirányítás (számítástechnika) - Redirection (computing)
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
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
- Here-document , a parancssori parancsértelmezőkbe beadandó szöveg megadásának módja
- Kagylólapátolás
- Parancs helyettesítés
- A folyamat helyettesítése
Külső linkek
- : másolja a megnyitott fájlleírót - Rendszerinterfész -hivatkozás, Egységes UNIX -specifikáció , 7. szám a The Open Group -tól
- A Linux Information Project (LINFO) átirányítási definíciója
- I/O átirányítás a Linux dokumentációs projektben
- Átirányítás a Windows rendszerben
- Gyermekfolyamat létrehozása átirányított bemenettel és kimenettel a Windows rendszerben