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 ..
Jawaban:
Dari
man bash
: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/>\(
.sumber
>(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 (>
atau1>
) atau standard error (2>
) ke file atau proses.>&2
adalah redirection output tetapi dalam kasus ini, outputtee
dikirim ke standard error (itulah yang&2
merupakan&1
output 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:Seperti yang Anda lihat,
$foo
yang didefinisikan dalam subkulit terpisah dari yang ditentukan dalam shell induk.sumber
>(...)
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.cmd 2>&1 > output | tee err >&2
>
dapat menunjukkan output-redirection dan yang()
dapat menunjukkan subshell, tetapi>(...)
sebenarnya fitur tunggal, kesatuan yang tidak terdiri dari>
dan()
.