Katakanlah saya memiliki skrip yang ingin saya pipekan ke perintah lain atau redirect ke file (piping ke sh
untuk contoh). Asumsikan saya menggunakan bash.
Saya bisa melakukannya dengan 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 saya bisa membuatnya sehingga cat
mengeluarkan teks dari stdin, dan kemudian mengirimnya ke lokasi yang sewenang-wenang?
shell
io-redirection
cat
here-document
strugee
sumber
sumber
touch
adalah kecuali di sana, apa yang sebenarnya Anda inginkan? baru saja membaca file input dan mengarahkan ke yang lain dengan stdout?echo
- Saya bertanya-tanya apa yang setara akan menggunakancat
.sh
skrip dari banyak string dan meneruskannya langsung kesh
. Saya menemukan Q Anda mencari lewat keluaran teks dari beberapa perintah, termasuk dokumen DI SINI, langsung ke perintah. Itulah yang dilakukan oleh contoh kedua jawaban Ash.Jawaban:
Ada beberapa cara untuk melakukan ini. Mungkin yang paling sederhana adalah ini:
Lain, yang sintaksisnya lebih bagus menurut saya:
Ini berfungsi juga, tetapi tanpa subkulit:
Lebih banyak variasi:
Atau:
By the way, saya berharap penggunaan
cat
dalam pertanyaan Anda adalah pengganti untuk sesuatu yang lain. Jika tidak, keluarkan, seperti ini:Yang bisa disederhanakan menjadi ini:
atau:
Mengarahkan output, bukan perpipaan
Menggunakan
cat
untuk mendapatkan yang setara denganecho test > out
:Dokumen Berganda Di Sini
Ini menghasilkan output:
Inilah yang terjadi:
( ... )
dan menjalankan perintah terlampir dalam sebuah subkulit.cat <&3
mengatakan untuk menjalankan kucing dengan deskriptor file (fd) 0 (stdin) diarahkan dari fd 3; dengan kata lain, keluarkan input dari fd 3.(...)
dimulai, shell melihat dua di sini dokumen pengalihan dan pengganti fd 0 (<<EOF
) dan fd 3 (3<<EOF2
) dengan sisi baca pipasumber
(cat; echo ---; exec <&3; cat) <<EOF 3<<EOF2 >out
dan kemudian berikan input perintah dengan dua blok di sini secara berurutan.cat
setaraecho test > out
dengan menggunakan heredoc. Sedangkan contoh yang Anda berikan menambahkan pengalihan di ujung pipa.Saya hanya ingin menunjukkan bahwa menggunakan
meow
sama validnya denganEOF
.Script ini akan ditambahkan
Meow!
ke file bernamacat
:Simpan sebagai
cats
dan buat itu dapat dieksekusi denganchmod +x cats
, lalu jalankan dengan./cats
:Penjelasan:
cat <<meow
adalah sintaks dokumen di sini . Itu menginstruksikan skrip untuk mengambil blok teks yang mengikuti baris ini, sampai bertemu stringmeow
. Konten kemudian akan dikeluarkan (atau disalurkan bersama).>> cat
pipa ke file bernamacat
.>
alih-alih>>
akan menimpa file alih-alih menambahkannya.Meow!
adalah isi dari dokumen di sini .meow
adalah penanda akhir untuk dokumen di sini . Isi, dengan penggunaan>>
, ditambahkan kecat
.Memipis ke stdout dan ke file:
Untuk melakukan pemipaan yang Anda minta, tidak ada dokumen yang diperlukan di sini.
cat
tidak dapat menghasilkan teks dan meneruskan teks, tetapitee
sangat cocok untuk apa yang Anda minta:Ini akan menghasilkan string
echo
dan menulisecho
ke file bernamatee
.Anda juga dapat melewati output
cat
, jika itu adalah bagian dari persyaratan, baik dengan:Atau hanya:
Isi file:
sumber
>
tidak membuat pipa seperti yang ditunjukkan oleh peluru terakhir Anda.>
dapat membuat pipazsh
ketika fd yang sama dialihkan beberapa kali seperti diecho foo >&1 > tee
atauecho foo > tee | cat
, di manazsh
mengimplementasikan internaltee
untuk memberi makan outputecho
untuk keduanyacat
dantee
file.