bir boru veya pipe aslında UNIX / Linux için mevcut olan ve çok pratik bir işlem hattıdır. Ancak bir borunun ne olduğunu tam olarak anlamak için, * nix ortamında 3 yerleşik veri akışına sahip olduğunu bilmelisiniz. Bu, bilmeyenler için, verilerin üç noktadan veya üç noktadan seyahat edebileceği anlamına gelir.
O zaman bunu daha iyi anlayacaksın, ama şimdi size açıklığa kavuşturmak istediğim şey, bir boru hattıyla yapabileceğiniz şey, bu noktalardan birinden diğerlerine kanal olmaktır. Bu, bir programın kullanması için bir diğerinin girdisine doğru attığı çıktı veya sonucu almaya izin verir, vb. Onu çok iyi anlamanıza yardımcı olacak bazı pratik örneklerle açıklamaya çalışacağım.
Bahsettiğim o noktalar veya veri akışları, vardır:
- stdin: 0'a karşılık gelir ve standart giriştir. Genel olarak, bir * nix sistemi için standart giriş klavyedir. Yani, yazdıklarınız kullanılan bilgiler olacaktır. Kendisiyle ilişkili / dev / stdin olan özel bir aygıtı var.
- stdout'u: 1 ile tanımlanır, standart çıktıdır. Genellikle, bilgileri görebileceğiniz bilgisayarınızın monitörüne veya ekranına karşılık gelir. Örneğin, bir ls komutunu çalıştırdığınızda, içerik listesi ekranda görüntülenecek, değil mi? İlişkili aygıt / dev / stdout'tur.
- Stderr: 2 ile tanımlanan, bir programda bir hata meydana geldiğinde standart hata çıktısıdır. İlişkili aygıt / dev / stderr'dir.
Bir ardışık düzen ile bir komutun standart çıktısını veya stdout'unu doğrudan diğerinin standart girişine geçirebilirsiniz.. Yani, bir programın diğerini beslemesini sağlayabilirsiniz. Klavye ile girilen parametreleri kullanmak yerine, bir kanal, | ile temsil edilen bu ardışık düzen aracılığıyla önceki komut tarafından üretilen bilgileri iletir.
ile örnekler daha iyi anlayacaksın. Bir dizinin içeriğini listelemek istediğinizi, ancak yalnızca doc kelimesiyle eşleşen isimleri görmek istediğinizi varsayalım. Dolayısıyla, ls'nin çıktısını grep filtresinin girişine boru hattıyla yönlendirmek ve ona yalnızca bu modelle eşleşenleri görüntülemesini söylemek için bir boru hattı kullanabilirsiniz:
ls -l | grep doc
Bu yüzden size tüm isimleri göstermek yerine, sadece size seni gerçekten ilgilendirenler. Bir dosyanın içeriği için de aynısını yapabilirsiniz. Hepsini değil, yalnızca firefox adlı işlemlerin bilgilerini görmek istediğinizi düşünün:
ps aux | grep firefox
Ekranda ps programının tüm çıktısını (stdout) göstermek yerine, yaptığı şey onu grep filtresinin girişine yönlendirmektir ve çıktıda yalnızca bu durumda firefox modeline karşılık gelen şeyi gösterir ...
İsterseniz kullanabilirsiniz çeşitli borular bir komutun çıktısını başka bir ikinci komutun girişine ve bu saniyenin çıktısını üçüncü bir komutun girişine getirmek için vb. Örneğin:
cat libro | grep love | more
Gördüğün gibi olasılıklar çoktur, hayal edebileceğiniz ve izin verilen her şey. Bir dosyanın yalnızca ilk ve son satırlarını gösterseniz bile, listeden gelen wc'ye giren satırları sayın ve hatta sıralayın:
cat listado | head cat listado | tail cat listado | wc -l cat listado | sort
Şunlarla da çalışabilirsiniz: ile ilgili hatalar | & ve örneğin başarısız olursa, bir komut dosyasının çıktısında uyarı kelimesini arayın:
./miscript |& grep alerta
Son olarak, borularla yakından bağlantılı iki komut vardır. tee ve xargs ve bunların olanaklarını daha da genişletebilirler. Tee durumunda, izin vereceği şey, önceki programın sonucunu standart çıktıda göstererek onu görebilmektir ve buna ek olarak, başka bir dosyaya aktarabilir. Bir dizinin içeriğini listelerseniz ve o anda ls -l çıktısını görmek ve ayrıca list.txt dosyasında kaydettirmek isterseniz buna bir örnek verilebilir:
ls -l | tee listado.txt
Tişört kullanmazsanız çıkışı konsolunuzda göremezsiniz ...
Y xargs bazı durumlarda daha da ilginçtir. Bu durumda, boru hattı üzerinden aldığı standart girdiden bir komut oluşturabilir. Başka bir deyişle, önceki bir programın çıktısı aracılığıyla başlattığı ve ardışık düzen üzerinden xargs'e ulaşarak onu argüman olarak başka bir komuta ileten her şeyi yakalayabilir.
Hala anlamadın mı? Bir örnekle çok daha iyi göreceksiniz. Tüm lanet olası thumbs.db dosyalarını bir dizinden, diskten veya bölümden kaldırmak istediğinizi düşünün. Çok sayıda varsa, bunları manuel olarak silmek için rm komutuyla tek tek gitmek imkansız olabilir. Ancak xargs ile her şeyi otomatikleştirebilirsiniz. Ve bunları bulmak için find'ı kullanarak yapabilirsiniz, çıktıyı xargs'ın girdisi yoluyla gönderebilirsiniz ve bu da rm'ye argümanlar olarak isimleri verecektir. Bu nedenle, bulunan tüm olanlar otomatik olarak silinecektir:
find ./ -name "thumbs.db" | xargs rm
Örneğin, /home/name/thumbs.db, /media/test/thumbs.db ve /tmp/thumbs.db konumlarının bulunduğunu varsayalım. Pekala, xargs onları sanki argümanlarmış gibi rm'ye teslim edecek. Yani, biz çalıştırmışız gibi: rm /home/name/thumbs.db, ardından rm /media/test/thumbs.db ve ardından rm /tmp/thumbs.db.
Mükemmel, bu bilgi biz linux kullanıcıları için çok önemli
Şu anda Linux Komut Satırı kitabında I / O yönlendirmesi üzerinde çalıştığım için ne güzel bir makale. Borular (Boru Hattı) ve üç veri akışı hakkında benim için daha net. Katkı takdir edilmektedir. Selamlar.
Xarjlı örnek bana bir eldiven gibi uyuyordu. Tam olarak bugün, "parçalar halinde" göndermek zorunda olduğum çoklu bir çıkışın ayrıntılarıyla uğraşıyordum. xargs bir pinturita yürüdü.
Çok minnettarım!