Dalam Bash versi 4.2.47(1)-rilis ketika saya mencoba untuk mengatenate teks berformat yang berasal dari dokumen HERE seperti:
cat <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
) # I want this paranthesis to end the process substitution.
Saya mendapatkan kesalahan berikut:
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
)
Saya juga tidak ingin mengutip dokumen HERE, yaitu menulis <'FOOBAR'
, karena saya masih ingin ada variabel yang diganti di dalamnya.
Jawaban yang Diterima:
Proses substitusi kira-kira setara dengan ini.
Contoh – mekanisme substitusi proses
Langkah #1 – buat fifo, output ke sana
$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492
Langkah #2 – baca fifo
$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+ Done fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1
Penggunaan parens dalam HEREDOC juga tampaknya OK:
Contoh – hanya menggunakan FIFO
Langkah #1 – keluaran ke FIFO
$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628
Langkah #2 – baca isi FIFO
$ cat /var/tmp/fifo1
(one)
(two
Masalahnya, saya yakin Anda mengalami adalah bahwa proses substitusi, <(...)
, tampaknya tidak mempedulikan sarang induk di dalamnya.
Contoh – sub proses + HEREDOC tidak berfungsi
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$
Melarikan diri dari orang tua tampaknya menenangkannya, sedikit:
Contoh – keluar dari parens
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
(one)
(two
Tetapi tidak benar-benar memberikan apa yang Anda inginkan. Membuat orang tua seimbang juga tampaknya menenangkannya:
Contoh – menyeimbangkan parens
$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)
Setiap kali saya memiliki string yang kompleks, seperti ini untuk bersaing di Bash, saya hampir selalu akan membangunnya terlebih dahulu, menyimpannya dalam variabel, dan kemudian menggunakannya melalui variabel, daripada mencoba dan membuat beberapa liner rumit yang akhirnya menjadi rapuh.
Contoh – gunakan variabel
$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)
Kemudian untuk mencetaknya:
$ echo "$var"
(one)
(two
Referensi
- Pergantian Proses
- Bagaimana saya bisa menulis dokumen di sini ke file dalam skrip bash?
- Menggunakan Pipa Bernama dan Substitusi Proses
- Menutup Kurung di Dokumen Berikut