Borular: GNU / Linux'ta kullanmaya başlamak için bilmeniz gerekenler

boru hatları

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.


Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: AB Internet Networks 2008 SL
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.

  1.   Jose dijo

    Mükemmel, bu bilgi biz linux kullanıcıları için çok önemli

  2.   Daniel dijo

    Ş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.

  3.   01101001b dijo

    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!