en rör eller pipe är faktiskt en pipeline tillgänglig för UNIX / Linux och mycket praktisk. Men för att helt förstå vad ett rör är bör du veta att det i en * nix-miljö har 3 inbyggda dataströmmar. För de som inte vet betyder det att uppgifterna kan resa till eller från tre punkter.
Då kommer du att förstå detta på ett bättre sätt, men det jag vill göra klart för dig nu är att du med en pipeline kan kanalisera från en av dessa punkter till andra. Detta gör det möjligt att ta utmatningen eller resultatet som ett program kastar mot inmatningen från en annan för att den ska använda etc. Jag kommer att försöka förklara det med några praktiska exempel som hjälper dig att förstå det mycket bra.
De punkter jag pratade om eller dataströmmar, är:
- stdin: motsvarar 0 och är standardingången. Generellt är standardingången för ett * nix-system tangentbordet. Det vill säga, vad du skriver kommer att vara den information som används. Hon har en speciell enhet associerad med den som är / dev / stdin.
- stdout: identifierad med 1, det är standardutgången. Vanligtvis motsvarar det datorns bildskärm eller skärm, där du kan se informationen. Till exempel när du kör ett ls-kommando kommer innehållsförteckningen att visas på skärmen, eller hur? Den tillhörande enheten är / dev / stdout.
- stderr: identifieras med 2, det är standardfelutgången, för när ett fel uppstår i ett program. Den tillhörande enheten är / dev / stderr.
Med en pipeline kan du få standardutmatningen eller stdout för ett kommando att passera direkt till en ingångs standardingång. Det vill säga, du kan få ett program att mata ett annat. I stället för att använda parametrar som matats in på tangentbordet levererar ett rör den information som genererats av det tidigare kommandot genom denna pipeline representerad av |
med exemplen du kommer att förstå det bättre. Antag att du vill lista innehållet i en katalog, men att du bara är intresserad av att se namnen som matchar ordet doc. Så du kan använda en pipeline för att leda utdata från ls till ingången till grep-filtret för att berätta att den bara ska visa de som matchar det mönstret:
ls -l | grep doc
Så istället för att visa dig alla namn, visar det dig bara de som verkligen intresserar dig. Du kan göra detsamma med innehållet i en fil. Tänk dig att du bara vill se informationen om de processer som heter firefox och inte alla:
ps aux | grep firefox
Istället för att visa alla utdata från ps-programmet på skärmen (stdout), kanaliserar det det mot ingången till grep-filtret och visar bara i utgången vad som motsvarar firefox-mönstret i det här fallet ...
Om du vill kan du använda olika rör att föra utgången från ett kommando till ingången till ett annat andra kommando, och utgången från den andra till ingången till ett tredje, och så vidare. Till exempel:
cat libro | grep love | more
Som ni ser, möjligheterna är många, allt du kan föreställa dig och är tillåtet. Visa till och med bara de första och sista raderna i en fil, räkna raderna som kommer in i wc som kommer från listan och till och med sortera dem:
cat listado | head cat listado | tail cat listado | wc -l cat listado | sort
Du kan också arbeta med fel med | & och leta till exempel efter ordvarningen i utskriften av ett skript om det misslyckas:
./miscript |& grep alerta
Och slutligen finns det två kommandon som är nära kopplade till rören tee och xargs och att de ytterligare kan utöka möjligheterna för dessa. När det gäller tee är det vad det tillåter att visa resultatet av det tidigare programmet på standardutmatningen så att du kan se det, och förutom det kan det leda till en annan fil. Ett exempel kan vara om du listar innehållet i en katalog och vill se utdata från ls -l för tillfället och också spara det i en fillista.txt:
ls -l | tee listado.txt
Om du inte använder tee kan du inte se utdata på konsolen ...
Y xargs det är ännu mer intressant i vissa fall. I det här fallet kan den bygga ett kommando från den standardingång som den tar emot via rörledningen. Med andra ord är det kapabelt att fånga allt som ett tidigare program har lanserat genom dess utdata och som når xargs genom rörledningen för att vidarebefordra det till ett annat kommando som argument.
Förstår du det fortfarande inte? Du kommer att se det mycket bättre med ett exempel. Tänk dig att du vill ta bort alla jävla thumbs.db-filer från en katalog, disk eller partition. Om det finns många kan det vara omöjligt att gå en efter en med rm-kommandot för att radera dem manuellt. Men med xargs kan du automatisera allt. Och du kan göra det med hjälp av hitta för att lokalisera dem, skicka utdata genom inmatningen av xargs och detta i sin tur ger rm namnen som argument. Därför raderas alla lokaliserade automatiskt:
find ./ -name "thumbs.db" | xargs rm
Antag till exempel att hitta lokaliserar /home/name/thumbs.db, /media/test/thumbs.db och /tmp/thumbs.db. Tja, xargs kommer att leverera dem till rm som om de vore argument. Det vill säga som om vi hade kört: rm /home/name/thumbs.db, sedan rm /media/test/thumbs.db och sedan rm /tmp/thumbs.db.
Utmärkt, denna information är mycket viktig för oss Linux-användare
Vilken bra artikel just nu när jag studerar I / O-omdirigering i Linux Command Line-boken. Det är tydligare för mig om rören (Pipeline) och de tre dataströmmarna. Bidraget uppskattas. Hälsningar.
Exemplet med xargs passade mig som en handske. Exakt idag hade jag att göra med detaljerna om en multipelutgång som jag var tvungen att skicka "i delar". xargs gick en pinturita.
Super tacksam!