Katakanlah saya memiliki skrip yang ingin saya salurkan ke perintah lain atau mengarahkan ulang ke file (menyalurkan ke sh
untuk contoh). Asumsikan saya menggunakan bash.
Saya bisa melakukannya menggunakan echo
:
echo "touch somefile
echo foo > somefile" | sh
Saya juga bisa melakukan hal yang hampir sama menggunakan cat
:
cat << EOF
touch somefile
echo foo > somefile
EOF
Tetapi jika saya mengganti “EOF” dengan “EOF | sh” itu hanya berpikir bahwa itu adalah bagian dari heredoc.
Bagaimana caranya agar cat
mengeluarkan teks dari stdin, lalu menyalurkannya ke lokasi yang berubah-ubah?
Jawaban yang Diterima:
Ada beberapa cara untuk melakukan ini. Yang paling sederhana mungkin ini:
cat <<EOF | sh
touch somefile
echo foo > somefile
EOF
Lain, yang sintaksnya lebih bagus menurut saya:
(
cat <<EOF
touch somefile
echo foo > somefile
EOF
) | sh
Ini juga berfungsi, tetapi tanpa subkulit:
{
cat <<EOF
touch somefile
echo foo > somefile
EOF
} | sh
Lebih banyak variasi:
cat <<EOF |
touch somefile
echo foo > somefile
EOF
sh
Atau:
{ cat | sh; } << EOF
touch somefile
echo foo > somefile
EOF
Omong-omong, saya mengharapkan penggunaan cat
dalam pertanyaan Anda adalah pengganti untuk sesuatu yang lain. Jika tidak, keluarkan, seperti ini:
sh <<EOF
touch somefile
echo foo > somefile
EOF
Yang bisa disederhanakan menjadi ini:
sh -c 'touch somefile; echo foo > somefile'
atau:
sh -c 'touch somefile
echo foo > somefile'
Mengalihkan keluaran alih-alih pemipaan
sh >out <<EOF
touch somefile
echo foo > somefile
EOF
Menggunakan cat
untuk mendapatkan yang setara dengan echo test > out
:
cat >out <<EOF
test
EOF
Beberapa Dokumen Di Sini
( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2
hi
EOF
there
EOF2
Ini menghasilkan output:
hi
---
there
Inilah yang terjadi:
- Shell melihat
( ... )
dan menjalankan perintah terlampir dalam subkulit. - Kucing dan gema cukup sederhana.
cat <&3
mengatakan untuk menjalankan cat dengan deskriptor file (fd) 0 (stdin) dialihkan dari fd 3; dengan kata lain, keluarkan input dari fd 3. - Sebelum
(...)
dimulai, shell melihat dua dokumen di sini dialihkan dan menggantikan fd 0 (<<EOF
) dan fd 3 (3<<EOF2
) dengan sisi baca pipa - Setelah perintah awal dimulai, shell membaca stdinnya sampai EOF tercapai dan mengirimkannya ke sisi tulis dari pipa pertama
- Selanjutnya, ia melakukan hal yang sama dengan EOF2 dan sisi tulis pipa kedua