Bash'teki borulara girdilerin nasıl gönderildiğini anlama


17

Boruların bash'da nasıl çalıştığını tam olarak anlamıyorum.

Başka bir komutta girdi olarak bir komuttan bir çıktı aldığını biliyorum.

Ne çıktı alabilirim çünkü komutun ekrana yazdırdığı şey bu.

Ancak bir komutun hangi girdiyi alacağını nasıl bilebilirim?

İşte işe yarayacağını düşündüğüm bir örnek:

which gem | rm

Ne yazık ki olmadı.

/usr/bin/gemÇıktının doğru olması için hangi taş çıktı?

Ben rm için verildi düşündüm bu yüzden woud olurdu rm /usr/bin/gemama yanılmışım.

Benim sorum şu: Bir komutun hangi girdiyi aldığını nasıl bilebilirim?


2
Başka rm /usr/bin/gembir şey dışında, korkunç bir fikir. Bunu gem(ve birlikte kullandığı Ruby yorumlayıcısını) yalnız bırakın ve tercih ettiğiniz Ruby yorumlayıcısını (ve gem) aşağıdakileri kullanarak kurunrvm : rvm.beginrescueend.com
Telemachus

Yanıtlar:


23

"Girdi" ve "komut satırı bağımsız değişkenleri" farklı şeylerdir.

rm bağımsız değişkenler olarak sağlanan dosyaları kaldırır.

Bir boru, sol komutun çıkışını sağ komutun girişine yönlendirir. Sağdaki programın komut satırı argümanlarını etkilemez.

Yapmaya çalıştığınız şeyi yapmak için, xargsbir programı yürütmek üzere standart girdiyi komut satırı bağımsız değişkenlerine dönüştürmeyi deneyin . Bu onun işi.

which gem | xargs rm, örneğin, PATH'nizdeki öğesini kaldırır gem.


12

rmgirdi almaz, argümanlar alır. Bunlar farklı. Bağımsız değişkenler, komut satırındaki bir programa davranışını etkilemek için verdiğiniz anahtarlar ve dosya adlarıdır. Girdi, programın üzerinde çalıştığı verilerdir. Örneğin, grephem girdi hem de bağımsız değişkenleri alır:

grep "foo" file.txt

Orada iki argüman var "foo"ve file.txt. Girdi olan içerikleri arasında file.txtdeğil, dize file.txtkendisi. Grep girdi aldığından, borularla kullanabilirsiniz:

cat file.txt | grep "foo"

Kedi alıyor, çünkü aynı çıktı üreten file.txtbir bağımsız değişken olarak ve üretim içeriği ve file.txtçıkışı olarak. Bu çıktı daha sonra ilk örnekte olduğu gibi, grep'in dosyanın kendisini açmasıyla aynı etkiyi vererek grep'e aktarılır.

Bir programın çıktısını başka bir programın argümanı olarak kullanmak istiyorsanız, backticks kullanırsınız:

rm `which gem`

veya bu alternatif (bash'a özgü) sözdizimi:

rm $(which gem)

Düzenleme: veya xargsbaşka bir yanıtcının işaret ettiği gibi. Komut satırı olan bir kediyi ciltlemenin birçok yolu.


cat file.txt | grep "foo"Yüzlerce kez daha yavaş olabileceğini belirtmek gerekir grep "foo" file.txt.
Borealid

1
bu alamadım kısmı. nasıl bir argüman ve standart girdi nedir?
ajsie

8
@ajsie: Program adından sonra ve enter tuşuna basmadan önce yazarsanız, bu bir argümandır. Çalışmaya başladıktan sonra programa yazarsanız, standart girdi olur.
Borealid

1
Anladım! Bu her şeyi açıkladı. Şimdi hem komutu doğrudan kullanabileceğimi ve bana sorup sormadığını (grep) görebilirim ve ayrıca std girişini kullanıp kullanmadığını görmek için kılavuzu (man grep) okuyabilirim.
ajsie

@ajsie: Eğer mangaya dalmak istemiyorsanız, grep --helpkabul edilen argümanlara hızlı bir genel bakış da vardır .
Borealid

3

Check out mankomutları sen ilgilenen yılında sayfalarını. Bu programlar onlar okunan olduğunu gösterecektir stdin(denemede man grepstdin'i okur popüler bir komut için).


Son maç olarak denedim man grep | grep 'standard input've aldım If no file arguments are specified, the standard input is used.. Medicine grepKendi tıbbından biraz tat vermek zorunda kaldım . 😎
ma11hew28

2

PATH'nizde boşluk içeren bir dizin varsa veya komut adı boşluk içeriyorsa, bunların tümü tehlikelidir:

rm `which gem`       # Dangerous
rm $(which gem)      # Dangerous
which gem | xargs rm # Dangerous

GNU Paralel http: // www.gnu.org/software/parallel/ bu sorunla karşılaşmaz, bu nedenle PATH'nizde boşluk içeren bir dizininiz olsa veya komut adı boşluk içeriyor olsa bile bu işe yarar:

which gem | parallel rm
parallel -a <(which bass) rm

GNU Parallel için tanıtım videosunu izleyin: http://www.youtube.com/watch?v=OpaiGYxkSuQ

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.