A számítástechnikában az átirányítás a folyamatok közötti kommunikációA folyamatok közötti kommunikáció az adatok megosztását jelenti egy számítógépes rendszerben futó folyamatok között. egyik formája, és a legtöbb parancssori értelmezőben közös funkció, beleértve a különféle Unix shelleket is, amelyek a szabványos adatfolyamokat átirányíthatják a felhasználó által megadott helyekre.A számítógép-programozásban a szabványos adatfolyamok (standard streams) előre összekapcsolt bemeneti és kimeneti kommunikációs csatornák egy számítógépes program és környezete között, amikor a program végrehajtása megkezdődik. A három bemeneti/kimeneti (I/O) kapcsolatot szabványos bemenetnek (stdin), szabványos kimenetnek (stdout) és szabványos hibának (stderr) nevezik. Az átirányítás koncepciója meglehetősen régi, egészen a legkorábbi operációs rendszerekig (OS) nyúlik vissza. Az átirányítás tervezési céljainak tárgyalása már megtalálható a Multics OS bemeneti-kimeneti alrendszerének 1971-es leírásában. A UNIX operációs rendszer és annak „csövei” megjelenése előtt azonban az operációs rendszerekben az átirányítás nehéz vagy akár lehetetlen volt.
Unix-szerű operációs rendszerekben a programok a dup2(2) rendszerhívással, vagy annak kevésbé rugalmas, de magasabb szintű stdio analógjaival, a freopen(3) és a popen(3) függvényekkel végzik az átirányítást.The GNU C Library Reference Manual for version 2.38 gnu.org
Szabványos bemenet és szabványos kimenet átirányítása Az átirányítást általában bizonyos karakterek parancsok közé helyezésével valósítják meg.
Alapok Ezeknek a karaktereknek a szintaxisa jellemzően a következő, a < jellel átirányítjuk a bemenetet (standard input), a > jellel pedig a kimenetet (standard output). A command > file1 végrehajtja a parancsot (command), a kimenetet a file1-be helyezve, ahelyett, hogy a terminálon jelenítené meg, ami a standard kimenet szokásos célja. Ez kitörli a file1-ben lévő összes meglévő adatot.
A command < file1 parancs használata esetén a rendszer végrehajtja a command parancsot, a file1-et használva bemenetként, szemben a billentyűzettel, amely a szokásos szabványos beviteli forrás.
A command < infile > outfile két képességet egyesít: az infile-ból olvas, a outfile-ba pedig ír.
Változatok A kimenet fájl végéhez fűzéséhez a fájl felülírása helyett a >> operátort használjuk: command1 >> file1.
Egy stream literálból (egy standard bemenetre átadott beágyazott fájlból) való olvasáshoz használhatunk egy here dokumentumotA számítástechnikában a here dokument (here-text, heredoc, hereis, here-string vagy here-script) egy fájlliterál vagy bemeneti adatfolyam-literál: egy forráskódfájl egy része, amelyet úgy kezel a rendszer, mintha egy különálló fájl lenne. a << operátor használatával: $ 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álhatunk egy here string-etEgy 'here string (elérhető bash, ksh vagy zsh nyelven) szintaktikailag hasonló, <<< jelekből áll, és bemeneti átirányítást hajt végre egy szóból (egy szóból, amelyet a shell egységként kezel, ebben a kontextusban általában egy karakterlánc literál). a <<< operátorral: tr a-z A-Z <<< "one two three", vagy: $ NUMBERS="one two three" $ tr a-z A-Z <<< "$NUMBERS" ONE TWO THREE
Csővezeték
A programok együtt futtathatók úgy, hogy az egyik program beolvassa a másik kimenetét anélkül, hogy szükség lenne egy explicit köztes fájlra. command1 | command2 végrehajtja a command1 parancsot, a kimenetét használva a command2 bemeneteként (általában piping-nak nevezik,A Unix-szerű operációs rendszerekben a csővezeték (pipeline) egy mechanizmus a folyamatok közötti kommunikációhoz üzenetküldés segítségével. A pipeline olyan folyamatok halmaza, amelyeket szabványos adatfolyamaik láncolnak össze, így minden folyamat kimeneti szövege (stdout) közvetlenül bemenetként (stdin) kerül átadásra a következőnek. ahol a "|" karakter a "pipe").
A parancsokat végrehajtó két program párhuzamosan futhat, az egyetlen tárhely pedig a munkapufferek (a Linux pufferenként akár 64K-t is engedélyez), plusz az egyes parancsok feldolgozásához szükséges munkaterület. Például egy „sort” parancs nem tud kimenetet előállítani, amíg az összes bemeneti rekordot be nem olvasta, mivel a legutoljára fogadott rekord bizonyulhat az elsőnek a rendezett sorrendben. Dr. Alexia MassalinAlexia Massalin (korábban Henry Massalin) amerikai informatikus és programozó. kísérleti operációs rendszere, a Synthesis, a bemeneti és kimeneti pufferek telítettségéhez igazította volna az egyes feladatok prioritását futás közben.
Ez ugyanazt a végeredményt adja, mintha két átirányítást és egy ideiglenes fájlt használnánk, például: $ command1 > tempfile $ command2 < tempfile $ rm tempfile
De itt a command2 nem indul el, amíg a command1 be nem fejeződik, és egy kellően nagy méretű munkafájlra van szükség a köztes eredmények, valamint az egyes feladatokhoz szükséges munkaterület tárolásához. Például, bár a DOS megengedi a „pipe” szintaxist, ezt a második megközelítést alkalmazza. Tegyük fel tehát, hogy egy hosszú ideig futó "Worker" program működés közben különféle üzeneteket generál, és egy második program, a TimeStamp minden rekordot átmásol a standard bemenetről a standard kimenetre, a rekord fogadásának rendszerdátumával és időpontjával előzve meg. Egy olyan sorozat, mint a Worker | TimeStamp > LogFile.txt, csak akkor hozna létre időbélyegeket, amikor a Worker befejezte a munkát, csupán azt mutatva, hogy milyen gyorsan olvasható és írható a kimeneti fájl.
A parancsok "piping" használatára jó példa az echo parancs egy másik paranccsal való kombinálása, hogy valami interaktívat érjünk el egy nem interaktív shellben, pl. echo -e 'user\npass' | ftp localhost. Ez az ftp klienst a user felhasználó beírásával, a return (Enter) megnyomásával, majd a pass parancs végrehajtásával.
Alkalmi használatban a pipeline kezdeti lépése gyakran a cat vagy az echo, egy fájlból vagy karakterláncból való olvasás. Ezt gyakran helyettesítheti a bemeneti indirekció vagy egy here string, és a cat és a pipe használata a bemeneti átirányítás helyett a cat haszontalan használataként ismert.A cat parancs haszontalan használata (Useless use of cat, UUOC) gyakori Unix zsargon azokra a parancssori konstrukciókra, amelyek csak a felhasználó kényelmét szolgálják. Például a következő parancsok: $ cat infile | command $ echo $string | command $ echo -e 'user\npass' | ftp localhost helyettesíthetők a következővel: $ command < infile $ command <<< $string $ ftp localhost <<< $'user\npass' Mivel az echo gyakran egy shell-en belüli parancs, a használatát nem kritizálják annyira, mint a cat parancsot, amely egy külső parancs.
Átirányítás a szabványos fájlkezelőkre és azokról Az eredeti Bourne shellből származó Unix shellekben az első két művelet tovább módosítható egy szám (a fájlleíróUnix és Unix-szerű operációs rendszerekben a fájlleíró (file descriptor) egy egyedi-folyamat azonosító (handle) egy fájlhoz vagy más bemeneti/kimeneti erőforráshoz, például egy pipe-hoz vagy hálózati sockethez.) közvetlen karakter elé helyezésével; ez befolyásolja, hogy melyik adatfolyamot használja a rendszer az átirányításhoz. A Unix szabványos I/O adatfolyamai a következők:
Handle Name Description 0 stdin Standard input 1 stdout Standard output 2 stderr Standard error
Például a command 2> file1 parancs végrehajtja a command parancsot, a standard hibafolyamot a file1-be irányítva.
A csh-ból (a C shellből) származó shellekben a szintaxis ehelyett az & (és) karaktert fűzi hozzá az átirányítási karakterekhez, így hasonló eredményt érve el. Ennek az az oka, hogy különbséget tegyünk az '1' nevű fájl és a stdout között, azaz cat file 2>1 vs. cat file 2>&1. Az első esetben a stderr az '1' nevű fájlra, a másodikban pedig a stderr a stdout-ra kerül átirányításra.
Egy másik hasznos képesség az egyik szabványos fájlkezelő átirányítása egy másikra. A legnépszerűbb változat a szabványos hiba egyesítése a szabványos kimenettel, így a hibaüzenetek a szokásos kimenettel együtt (vagy felváltva) feldolgozhatók. Például a find / -name .profile > results 2>&1 parancs megpróbálja megkeresni az összes ".profile" nevű fájlt. Átirányítás nélkül végrehajtva a találatokat a stdout kimenetre, a hibákat (pl. a védett könyvtárak bejárására vonatkozó jogosultság hiánya miatt) pedig a stderr kimenetre küldi. Ha a szabványos kimenet fájleredményekre van irányítva, hibaüzenetek jelennek meg a konzolon. Ha a találatokat és a hibaüzeneteket is látni szeretné a fájleredményekben, akkor a stderr kimenetet (2. kezelő) egyesítse a stdout kimenettel (handle 1.) a 2>&1 paraméterrel.
Ha az egyesített kimenetet egy másik programba kell átirányítani, akkor a fájlegyesítési szekvenciának (2>&1) meg kell előznie a pipe szimbólumot, tehát: find / -name .profile 2>&1 | less
A parancs egy egyszerűsített, de nem POSIX-konform formája, a command > file 2>&1 (nem érhető el a Bourne Shell 4-es verziója előtt, a végleges kiadás előtt, illetve a Debian/Ubuntu által használt standard Debian Almquist shellben): command &>file vagy command >&file.
Lehetséges a 2>&1 karakterláncot használni a ">" előtt, de az eredményt gyakran félreértik. A szabály az, hogy minden átirányítás függetlenül a kimeneti adatfolyamra állítja be a handle-t. Tehát a „2>&1” a 2 kezelőt arra a helyre állítja, amire az 1 kezelő mutat, ami ekkor általában a stdout. Ezután a „>” átirányítja az 1 kezelőt valami másra, például egy fájlra, de nem változtatja meg a 2 kezelőt, ami továbbra is a stdout-ra mutat.
A következő példában a standard kimenet fájlba kerül, de a hibák a stderr-ből a stdout-ba, azaz a képernyőre kerülnek: command 2>&1 > file.
A hibák és a szabványos kimenet fájlba írásához a sorrendet meg kell fordítani. A szabványos kimenet először a fájlba kerül átirányításra, majd a stderr kimenet is átirányításra kerül a már módosított, a fájlra mutató stdout azonosítóra: command > file 2>&1.
Láncolt folyamatok Az átirányítási és folyamatirányítási tokenek láncba köthetők összetett parancsok létrehozása érdekében. Például a sort infile | uniq -c | sort -n > outfile parancs lexikográfiai sorrendbe rendezi az infile sorait, az előfordulások számával előtagolt egyedi sorokat ír, numerikusan rendezi a kapott kimenetet, és a végső kimenetet az outfile-ba helyezi. Ez a fajta konstrukció nagyon gyakran használatos shell szkriptekben és batch fájlokban.
Átirányítás több kimenetre A standard tee parancs több célhelyre is átirányíthatja a parancs kimenetét: ls -lrt | tee xyz. Ez a fájllista kimenetét mind a standard kimenetre, mind az xyz fájlra irányítja.
Jegyzetek
Források
Fordítás
További információk dup: megnyitott fájlleíró duplikálása – System Interfaces Reference, The Single UNIX Specification, Version 5 from The Open Group Redirection Definition Linux Információs Projekt (LINFO)
Kategória:Informatika Kategória:Számítógép-programozás Kategória:Programozási alapfogalmak Kategória:Unix