Alt kabuk olmadan bash'ta bir komutun çıktısı üzerinde yineleme


9

Bir alt kabuk oluşturmadan veya geçici bir dosya kullanmadan bir komutun çıktısı üzerinden döngü istiyorum.

Komut dosyamın ilk sürümü böyle görünüyordu, ancak alt kabuk oluşturduğundan ve exitkomut gerekli olan ana komut dosyası yerine alt kabuğu sonlandırdığından bu çalışmıyor . İlke yönlendirmesini yapılandırmak için çok daha büyük bir komut dosyasının bir parçasıdır ve yönlendirmenin başarısız olmasına neden olacak bir durum algılarsa yürütmeyi durdurur.

sysctl -a 2>/dev/null | grep '\.rp_filter' | while read -r -a RPSTAT ; do

  if [[ "0" != "${RPSTAT[2]}" ]] ; then
    echo >&2 "RP Filter must be disabled on all interfaces!"
    echo >&2 "The RP filter feature is incompatible with policy routing"
    exit 1
  fi
done

Dolayısıyla önerilen alternatiflerden biri, alt kabuktan kaçınmak için böyle bir komut kullanmaktır.

while read BLAH ; do echo $BLAH; done </root/regularfile

Bana öyle geliyor ki, alt kabuktan kaçınmak ve yine de istediğim programdan çıktı almak için böyle bir komut kullanabilmeliyim.

while read BLAH ; do echo $BLAH; done <(sysctl -a 2>/dev/null | grep '\.rp_filter')

Ne yazık ki, bu komutu kullanmak bu hatayla sonuçlanır.

-bash: syntax error near unexpected token `<(sysct ...

Bu işe yaradığı için gerçekten kafam karıştı.

cat <(sysctl -a 2>/dev/null | grep '\.rp_filter')

Bu komutun çıktısını geçici bir dosyaya kaydedebilir ve geçici dosyada yeniden yönlendirmeyi kullanabilirim, ancak bunu yapmaktan kaçınmak istedim.

Neden yeniden yönlendirme bana bir hata veriyor ve geçici bir dosya oluşturmaktan başka seçeneklerim var mı?


Yanıtlar:


14

Bir cevapsız <. Olmalı:

while read BLAH ; do echo $BLAH; done < <(sysctl -a 2>/dev/null | grep '\.rp_filter')

<(sysctl -a 2>/dev/null | grep '\.rp_filter')Bir dosya olmayı düşünün .


Çok teşekkürler. Sadece benim düzenlemem için, bunu belgeleyen bir man sayfasına, yardıma veya web sayfasına yönlendirebilir misiniz? Bunu aramaya çalışırken Google'dan beni faydalı bir şeye yönlendirmesini sağlayamadım.
Zoredache

2

<() İkamesinin dosya tanımlayıcıları kullandığı ve bazı işletim sistemlerinde şeffaf olarak geçici dosyalar oluşturacağı ve kullanacağı belirtilmelidir.
ewindisch

@Zoredache: Sadece <(bash el kitabında arama yapın (“işlem ikamesi” altındadır).
Gilles 'SO- kötü olmayı bırak'

@ewindisch, bir araç şeffaf bir şekilde geçici bir dosya oluşturuyorsa, ihtiyacım olmadığından emin olduğumda manuel olarak bir tane oluşturmak istemedim.
Zoredache

0

Birisi daha buraya gelirse birkaç alternatif daha ...

Kabuk bağlı olarak, muhtemelen kullanabilir set -o errexit(bir kabuktaki dahil), bir komut, bir tuzak olmadan sıfır olmayan çıktığında üst kabuk çıkış için ifblok veya bir eğik &&ya da ||olduğu gibi,

/bin/false || echo "ignoring error"

Veya alt kabuğun kill'i ve varsa $ PPID ortam değişkenini kullanarak ana öğeye sinyal vermesini sağlayabilirsiniz.

Veya while bloğunu bir işleve taşıyabilir ve 0/1 (while while bloğundan sonra açıkça 0 döndürür) döndürebilir ve sadece boru hattınızı beğenebilirsiniz sysctl | grep | function || exit. Geri dönüşleri satır içi bloğa da koyabilirsiniz, ancak işlevler arkadaşınızdır. ;)

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.