Bash: Bir komutun çıktısından bir kerede bir satır nasıl okunur?


49

A komutunu kullanarak bash komutunun çıktısını okumaya çalışıyorum while loop.

while read -r line
do
    echo "$line"
done <<< $(find . -type f)

Çıktı aldım

ranveer@ranveer:~/tmp$ bash test.sh
./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello
ranveer@ranveer:~/tmp$ 

Bundan sonra denedim

$(find . -type f) | 
while read -r line
do
    echo "$line"
done 

ama bir hata üretti test.sh: line 5: ./test.py: Permission denied.

Öyleyse satır satır nasıl okuyacağım, çünkü şu an tüm çizgiyi bir anda karıştırdığını düşünüyorum.

Gerekli çıktı:

./test.py
./test1.py
./out1
./test.sh
./out
./out2
./hello

3
Bash SSS 01'i okumanızı öneriyorum - tuzaklarla ilgili kaçınılacak yararlı bilgiler ve tavsiyeler.
jw013

İçin while readkısmen, bkz IFS anlama ve orada bağlantılı sorular.
Gilles 'SO- kötülükten vazgeç'

Yanıtlar:


54

Bir hata var, ihtiyacın < <(command)yok<<<$(command)

< <( )Bir olan Proses değişikliği , $()bir olan komut ikamesi ve <<<bir olduğunu burada-string .


2
@RanRag $( )Her şeyi koymaya çalışmayı bırak ! Bu , komut çıktısını kullanmanın tek yoludur, komut değiştirme sözdizimidir . Borular ve proses ikamesi ve burada bulunan dizgeler diğerleridir ve hepsinin doğal olarak farklı sözdizimleri vardır. Ne yaptığınızı gerçekten bilmiyorsanız, zaten dosya adlarını ayrıştırmamalısınız.
jw013

Teşekkürler çalıştı hakkında daha fazla okuyacak Process Substitution.
RanRag

@ jw013: Ben bir acemi acemi duyuyorum. Gelecekte önerinizi aklımda tutacak.
RanRag

13

Dosya adlarını yeni satır karakterleri içermekten alıkoyacak bir şey olmadığını unutmayın. Bulunan her dosya için bir komut çalıştırmanın kurallı yolu .

find . -type f -exec cmd {} \;

Ve eğer bash işlerin yapılmasını istiyorsanız:

find . -type f -exec bash -c '
  for file do
    something with "$file"
  done' bash {} +

Ayrıca, komut dosyalarında "read" komutunu çağırmanın kurallı yolu (girişte fazladan işlem yapmasını istemiyorsanız):

IFS= read -r var

-rdurdurmaktır readiçin boş bir dizeye ayırıcılar listesini ayarlamak için = Ve IFS (ayırıcılar ve Yenisatır için çıkış karakteri olarak) özel olarak ters eğik çizgi karakterleri tedavi dan readHerhangi bir boşluk karakteri bu listede olsaydı aksi halde gelen elimden olur ( girişin başlangıcı ve sonu).

Kabuklarda ilmek kullanmak genellikle kötü bir fikirdir (birkaç aracı sırayla yüzlerce kez çalıştırmak yerine bir veya birden fazla aracı toplu halde çalıştırdığınız kabuklarda işlerin nasıl yapıldığını değil).

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.