Apa nama fitur shell `> (tee copyError.txt> & 2)`?

11

Saya perlu login stdout dan stderr ke file log, tetapi hanya menampilkan pesan kesalahan di layar. Saya bisa melakukan ini dengan:

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

Yang saya temukan di suatu tempat di web.

Saya hanya ingin tahu bagaimana >(tee copyError.txt >&2)hal ini disebut? Saya tidak bisa google untuk itu, karena Google mengabaikan karakter seperti kurung sudut dan tanda kurung ..

dersimn
sumber
Pengalihan file ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Kartik
@terdon Saya pikir OP telah menyatakan bahwa dia ingin login StdOut dan StdErr ke file, tetapi juga masih menunjukkan StdErr di layar
Dmitry Avtonomov

Jawaban:

11

Dari 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.

Anda dapat mencari halaman manual dengan menekan /dan kemudian mengetik string pencarian Anda, yang merupakan cara yang baik untuk menemukan informasi seperti ini. Itu tentu saja mengharuskan Anda tahu di mana halaman untuk mencari :)

Anda harus mengutipnya (, karena memiliki arti khusus ketika mencari. Untuk menemukan bagian yang relevan di halaman bash, ketik />\(.

Martin von Wittich
sumber
Saya melakukan banyak bash, jadi saya melakukan bash> bashman.txt dan membuatnya hanya bisa dibaca. Sekarang, saya dapat memuat bashman.txt ke jendela lain di editor teks saya (hanya baca) dan menggunakan semua fasilitas editor untuk mencari dan menyalin dan menempel.
Joe
8

>(tee copyError.txt >&2) sebenarnya adalah beberapa fitur yang berbeda:

  • >(...)disebut 'proses substitusi'. Itu menciptakan file pipa bernama/dev/fd dan menulis ke file itu akan memberikan input untuk proses dalam tanda kurung.

  • >: Secara umum, ini disebut 'redirection output' dan memungkinkan Anda untuk mengirim output standar ( >atau 1>) atau standard error ( 2>) ke file atau proses. >&2adalah redirection output tetapi dalam kasus ini, output teedikirim ke standard error (itulah yang &2merupakan &1output standar)

  • Tanpa >, tanda kurung ( ()) akan memulai subkulit. Menjalankan perintah dalam tanda kurung akan menelurkan shell lain yang hanya akan ada selama perintah itu berjalan. Anda dapat melihat bagaimana ini bekerja jika Anda mendeklarasikan variabel dalam subkulit:

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

    Seperti yang Anda lihat, $fooyang didefinisikan dalam subkulit terpisah dari yang ditentukan dalam shell induk.

terdon
sumber
4
Tidak >(...)bukan pengalihan. >(...)diperluas ke nama file. Jika Anda ingin mengarahkan keluaran ke itu, Anda perlu > >(...)tetapi >(...)lebih umum digunakan di mana pengalihan tidak dapat digunakan. Perintah OP dapat dicapai dengan pipa tradisional, tidak perlu untuk proses substitusi di sana.
Stéphane Chazelas
@StephaneChazelas Akan menyenangkan untuk melihat solusi yang ada dalam pikiran Anda
Dmitry Avtonomov
3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas
@StephaneChazelas thx!
Dmitry Avtonomov
Bagian pertama dari jawaban ini salah, atau setidaknya sangat menyesatkan; memang benar yang >dapat menunjukkan output-redirection dan yang ()dapat menunjukkan subshell, tetapi >(...)sebenarnya fitur tunggal, kesatuan yang tidak terdiri dari >dan ().
ruakh