Komut çıkışı diğer komutlara nasıl yönlendirilir?


83

Örnek:

ls | echohiçbir şey yazdırmaz (aslında boş bir satır). Bir dosya listesi yazdırmasını bekliyorum.

ls | grep 'foo'Öte yandan, beklendiği gibi çalışır (kendi adlarına 'foo' ile dosyaları yazdırır).

Bu durumlarda ne yapıyorum şunun gibi bir şey: ls | while read OUT; do echo $OUT; doneama bu oldukça zahmetli.

Borular neden bazı komutlarla çalışıyor ancak diğerleri ile çalışmıyor? Bu sorunu nasıl aşabilirim?


2
Ne yapmayı ls | echoumuyorsun? neden sadece koşmuyorsun ls?
theomega

12
Amacımı gösteren en basit örneği kullandım. Aslında bu sorunla, nesne deposunda git nesnelerini ve türlerini gösterecek tek bir astar yapmaya çalışırken karşılaştım. Böylece, nesne kimliğini aktardım git cat-file, ama işe yaramadı. Görünüşe göre, yankı aynı davranışa sahip, bu yüzden bir örnek olarak kullandım.
Mihai Rotaru

Ayrıca xargs için -n komutuna bakın, alt komutta kaç tane argüman yazacağını söylüyor. `... | xargs -n1 git cat-file`
Rich Homolka

Yanıtlar:


118

Komut satırı argümanları ve standart girdi arasında bir ayrım vardır. Bir boru bir işlemin standart çıkışını diğerinin standart girişine bağlar. Yani

ls | echo

Ls'nin standart çıkışını, standart yankı girişine bağlar. İyi değil mi? Eh, echo standart girdiyi yok sayar ve komut satırı argümanlarını - bu durumda hiçbiri - kendi stdout'una atar. Çıktı: hiçbir şey.

Bu durumda birkaç çözüm var. Birincisi, kedi gibi stdin okuyan ve stdout'a dökülen bir komut kullanmaktır.

ls | cat

İş tanımınızın ne olduğuna bağlı olarak 'çalışacaktır'.

Ama genel davadan ne haber? Gerçekten istediğiniz şey bir komutun stdout'unu diğerinin komut satırı argümanlarına dönüştürmektir. Diğerlerinin de söylediği gibi, xargsbu durumda kurallı yardımcı araçtır, komut satırını stdin'den bir komut için çıkar ve çalıştırmak için komutlar oluşturur.

ls | xargs echo

Bunu ayrıca ikame komutunu kullanarak da dönüştürebilirsiniz. $()

echo $(ls)

Ayrıca ne istersen onu yapardım.

Bu araçların her ikisi de kabuk komut dosyası yazmak için oldukça temeldir;

Bütünlük için, soruda belirtildiği gibi, stdin'i komut satırına dönüştürmenin diğer temel yolu kabuğun yerleşik readkomutudur. IFSHerhangi bir komut çalıştırmasında kullanabileceğiniz " değişkenleri " ( değişken tarafından tanımlanan kelimeler ) temp değişkenine dönüştürür.


1
Çok yararlı, bilgilendirici bir cevap, teşekkür ederim! Şu anda bash öğreniyorum ve daha önce hem xargs hem de $ (*) notasyonu gördüm, ama onlara fazla dikkat etmedim. Şimdi onların ne kadar önemli olduklarını biliyorum ve kesinlikle onlara bakacağım.
Mihai Rotaru

1
xargs OP'nin aradığı şey olabilir.
Iktys

19

ls | echosadece boş bir satır yazdırır, çünkü echogirdi yok; Boru hattının son komutu aslında echoboş bir satırdan başka bir şey basılmamasıdır.

Genellikle:

a | b

çıktısının agirişi olmasını sağlar b. PipelinesBölümünü okumanızı öneririm man bash.


Gerçekten kullanmak istiyorsanız lsve echobirlikte işte bazı (oldukça işe yaramaz) örnekler:

ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done

11

Eğer isterseniz komut denemede:echols

ls | xargs echo

Bu echoçıkışı ile arayacak ls.


3
Veya ls | xargs -I {} echo {}her bir hat için ayrı ayrı çağrılmasını istiyorsanız
Alex Abdugafarov

3

Neden sadece kullanmıyorsunuz:

echo `ls`

Veya çok daha güvenli:

echo "`ls -lrt`"

4
Ya da sadece echo *.
Kazark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.