Apa yang disebut sintaks bash '<(konten file)'?

25

Ini jawaban pada Keamanan StackExchange menggunakan sintaks pesta yang menarik untuk menghasilkan file in-line:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

Bit ini sangat menarik:

<(openssl ecparam -name secp384r1)

Berlari saja:

echo <(openssl ecparam -name secp384r1)

saya kembali /dev/fd/63

Jadi ini tampaknya membuat deskriptor file sementara dengan konten file

Apa ini namanya?

mikemaccana
sumber
3
Perhatikan bahwa "file" yang dihasilkan sebenarnya adalah pipa bernama, dan beberapa program tidak mendukungnya sebagai argumen file. Contoh: git diff --no-index file1 <(cat file2)akan gagal dengan: error: /dev/fd/63: unsupported file type. Anda mungkin juga melihat error: readlink("/dev/fd/63"): No such file or directoryapakah implementasi membuat symlink ke pipa (muncul sebagai tautan yang rusak untuk saya karena beberapa alasan).
Kelvin

Jawaban:

35

Ini disebut proses substitusi dan merupakan fitur bash, zsh dan ksh (dan mungkin yang lain, saya tidak tahu). Ini bukan POSIX dan Anda tidak boleh menggunakannya dalam kode portabel, tetapi sangat berguna.

Inilah bagian yang relevan dari manual bash:

3.5.6 Substitusi Proses

Substitusi proses didukung pada sistem yang mendukung pipa bernama (FIFO) atau metode / dev / fd untuk penamaan file yang terbuka. Ini mengambil bentuk

  <(list) 

atau

  >(list) 

Daftar proses dijalankan dengan input atau output yang terhubung ke FIFO atau beberapa file di / dev / fd. Nama file ini diteruskan sebagai argumen ke perintah saat ini sebagai hasil dari ekspansi. Jika formulir> (daftar) digunakan, menulis ke file akan memberikan input untuk daftar. Jika formulir <(daftar) digunakan, file yang dikirimkan sebagai argumen harus dibaca untuk mendapatkan output daftar. Perhatikan bahwa tidak ada ruang yang muncul antara tanda kurung <atau> dan kurung kurawal, jika tidak maka konstruk akan ditafsirkan sebagai pengalihan.

Jika tersedia, substitusi proses dilakukan bersamaan dengan ekspansi parameter dan variabel, substitusi perintah, dan ekspansi aritmatika.

terdon
sumber