`> (Tee copyError.txt> & 2)` kabuk özelliğinin adı nedir?


11

Günlük dosyaları için stdout ve stderr günlüğe kaydetmem gerekiyor, ancak yalnızca hata iletilerini ekranda gösteriyor. Bunu şu şekilde yapabilirim:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

Hangi internette bir yerde buldum.

Sadece bu >(tee copyError.txt >&2)şeyin nasıl adlandırıldığını bilmek istiyorum ? Google, köşeli ayraç ve parantez gibi karakterleri yok saydığından Google'ı kullanamıyorum.


Dosya yeniden yönlendirmesi ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Kartik

@terdon Bence OP dosyalara StdOut ve StdErr kaydetmek istediğini söyledi, ama yine de ekranda StdErr göstermek
Dmitry Avtonomov

Yanıtlar:


11

Gönderen man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

/Arama dizenizi basıp yazarak, bu gibi bilgileri bulmanın iyi bir yolu olan manalarda arama yapabilirsiniz . Tabii ki hangi manpage içinde arama yapacağınızı bilmenizi gerektirir :)

(Gerçi alıntı yapmalısınız , çünkü arama yaparken özel bir anlamı vardır. Bash manpage'deki ilgili bölümü bulmak için yazın />\(.


Bir sürü bash yaptım, bu yüzden bash> bashman.txt bir adam yaptım ve sadece okumasını sağladım. Şimdi, bashman.txt dosyasını metin düzenleyicimdeki (salt okunur) başka bir pencereye yükleyebilir ve editörün tüm özelliklerini arama, kopyalama ve yapıştırma için kullanabilirim.
Joe

8

>(tee copyError.txt >&2) aslında birkaç farklı özelliktir:

  • >(...)'süreç ikamesi' denir. Adlandırılmış bir kanal dosyası oluşturur /dev/fdve bu dosyaya yazmak parantez içindeki işleme girdi sağlar.

  • >: Buna genel olarak 'çıktı yeniden yönlendirme' denir ve bir dosyaya veya işleme standart çıktı ( >veya 1>) veya standart hata ( 2>) göndermenizi sağlar. >&2çıkış yönlendirme olduğunu ancak bu durumda, çıkış tee(neyi en standart hataya gönderilir &2olduğunu, &1standart çıkışı)

  • Olmadan >, parantez ( ()) bir alt kabuk başlatacaktır. Parantez içinde komutları çalıştırmak, yalnızca bu komutlar çalıştığı sürece var olacak başka bir kabuk oluşturacaktır. Alt kabukta bir değişken bildirirseniz bunun nasıl çalıştığını görebilirsiniz:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom
    

    Gördüğünüz gibi $foo, alt kabukta tanımlanan öğe, ana kabukta tanımlanandan ayrıdır.


4
Hayır >(...), bir yönlendirme değildir. >(...)bir dosya adına genişletilir. İsterseniz yönlendirmek olduğunu çıktı, ihtiyacınız > >(...)ama >(...)yönlendirmeler kullanılamaz nerede daha genel kullanılır. OP'nin komutu geleneksel borularla elde edilebilir, orada proses ikamesine gerek yoktur.
Stéphane Chazelas

@StephaneChazelas Aklınızdaki çözümü görmek güzel olurdu
Dmitry Avtonomov

3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas

@StephaneChazelas thx!
Dmitry Avtonomov

Bu cevabın ilk yarısı yanlış veya en azından oldukça yanıltıcı; o doğrudur >çıktı-yönlendirmeyi ifade edebilir ve bu ()bir altkabuk ifade edebilir, ama >(...)aslında oluşmuyor tek, üniter bir özelliktir >ve ().
ruakh
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.