GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Menggabungkan Substitusi Proses Bash Dengan Dokumen Here?

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
Terkait:Bagaimana cara memeriksa apakah proses Oracle DB berjalan di Unix dan di mana Oracle DB diinstal?
Linux
  1. Mengapa Substitusi Proses Bash Tidak Bekerja Dengan Beberapa Perintah?

  2. Apakah Rsync ~/foo Target/foo Sama Dengan Rsync ~/foo/ Target/foo/?

  3. Bagaimana Menemukan Proses Dengan Deskriptor File Maksimum?

  1. Cara menggabungkan perintah 'tar' dengan 'find'

  2. cara *memulai* proses dengan prioritas tinggi

  3. Cara mematikan proses <defunct> dengan induk 1

  1. Cara mematikan proses zombie di Linux

  2. Cara Memeriksa Penggunaan Memori Proses dengan Perintah pmap Linux

  3. Bagaimana Cara Menggabungkan Semua Garis Yang Berakhir Dengan Karakter Backslash?