Yeniden yönlendirme operatörü ile bir komuta hangi parametrenin sağlandığını nasıl anlayabilirim?


9

Bu çalışıyor:

$ echo "bildir-gönder HELLO" | şimdi

Bu yapmaz:

$ now <echo "bildir-gönder HELLO"

"Dosya veya dizin bulunamadı" yazıyor.

-fBelirli bir anda yürütülecek dosyayı sağlayabildiğim bu komutun bir seçeneği olduğunu anlıyorum .

Bu beni düşündürdü ... genel olarak, yeniden yönlendirme operatörlerinin değeri hangi parametre için sağladığını nasıl bilebilirim?


5
Sorunuz çok açık değil. "Hangi parametre" ile ne demek istiyorsun. Sorununuz muhtemelen (yanlışlıkla) bunu düşünmeniz foo | barve bar < fooeşdeğer olmanızdır . Onlar değil.
terdon

Yanıtlar:


16

Burada iki farklı şey kullanıyorsunuz ve üçte biri kullanıyor olmalısınız. Bakalım:

  1. |: Bu boru operatörüdür, bir işlemin çıktısını diğerine girdi olarak geçirmeye yarar:

    foo | bar

    Bu programı çalıştırır foove çıktısını programa girdi olarak iletir bar.

  2. >, <, >>Ve <<: Bunlar yönlendirme operatörleri onlar üzerine / veri göndermek için hizmet, dosyalar :

    • foo > bar: Programı çalıştırır foove onun çıkış kaydeder dosyası bar , üzerine yazılmasını 1 içeriğini ve yoksa oluştururken.

    • foo >> bar: Programı çalıştırır foove onun çıkış kaydeder dosyası bar , ekleme içindekilere ve yoksa oluştururken.

    • foo < bar: çalışır foo, dosyadan girdi okumasını söyler bar.

    • Bu <<, özel bir durumdur, çünkü bir komuta "ekleme" girdisinde bir nokta olmadığından, burada Belgeler<< için birincil olarak (yalnızca AFAIK) kullanılır :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF

      Yapı << SomeStringHere > Out.file, bitiş dizesiyle ( EOFyukarıdaki örnekte) karşılaşana kadar yazılan tüm metni hedef dosyaya yeniden yönlendirir. Burada dokümanlar çok satırlı dizeleri kolayca biçimlendirmenize ve değişkenler ve özel karakterler eklemenize olanak tanır.

  3. Burada Dize olan <<<işleç, Burada Belgeye benzer, ancak değişkenleri genişletir. Yani mesela:

    grep foo <<< "$bar"

    Yukarıdaki komut ile eşdeğerdir echo "$bar" | grep foo.

  4. Aslında aradığınız şey süreç ikamesi olarak adlandırılır ve bir komutun çıktısını diğerine geçirmenin başka bir yoludur. Oluşur <(command).

    foo <(bar) 

    Böylece, atörneğin,

    at now < <(echo "notify-send HELLO")

    Yukarıdakiler, işlem ikamesi aslında bir dosya oluşturduğundan (daha fazla ayrıntı için yukarıdaki bağlantıyı okuyun) ve bu dosyaya aktarılan dosyanın tanımlayıcısı olduğu <için çalışır at now.


1 Varsayılan davranış üzerine yazmaktır, bu noclobberseçenek bash olarak ayarlanarak değiştirilebilir . Ayarlanmışsa, echo foo > barbaşarısız olur bar. Bu durumda, bunun echo foo |> baryerine kullanılarak zorlanabilir . Bölüm 3.6.2 bakınız burada .


1
Güzel cevap! çok kapsamlı (özellikle dosya yönlendiricileri arasındaki farklar dahil)
steeldriver

teşekkürler, Aksiliğe AWW @steeldriver :) Ve öyle oldu bu takdir taş altında. Keşke çözümünüzün sessizce kaçındığı çeşitli tuzaklardan her biri için +1 verebilseydim.
terdon

Ayrıca <<ve <<<(@steeldriver yanıtında belirtilen) hakkında bazı bilgiler içerecek şekilde genişletebilir misiniz? Dahası, daha vardır - gibi bir şey >>>>>>ya <<<<<<<<<<?
Aditya

@Aditya bitti. Ve merak etmeyin, durur <<<:)
terdon

12

Bu durumda, echo "notify-send HELLO"bir işlem bir dosya değildir - bu nedenle bir dosya yönlendirmesi yerine bir işlem ikamesine ihtiyacınız vardır

at now < <(echo "notify-send HELLO")

Ayrıca kullanmış olabilir burada dize önlemek için echokomutu tamamen

at now <<< "notify-send HELLO"

5
Beğendiğiniz türden soruları gördükten sonra (aynı sorularım) Unix ve Linux için biraz daha fazla zaman geçirmeniz gerektiğini düşünüyorum . Biz orada serin kabuk hileler için yaşıyor ve ölüyor ..
terdon

@terdon: perl golfçüler için de aynı şey geçerli mi?
Sylvain Pineau

1
@SylvainPineau oooh evet. Çok fazla :). Cidden, sen, steeldriver ve benim hoşlandığımız türden bir soru orada çok daha yaygın. Yer commandline meraklılarının dolu bazı ait kime absürd bilgili.
terdon
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.