Contoh:
ls | echo
tidak mencetak apa pun (garis kosong, sebenarnya). Saya berharap untuk mencetak daftar file.
ls | grep 'foo'
, di sisi lain, berfungsi seperti yang diharapkan (mencetak file dengan 'foo' di namanya).
Apa yang saya lakukan dalam situasi ini adalah sesuatu seperti:
ls | while read OUT; do echo $OUT; done
tetapi ini agak rumit.
Mengapa perpipaan bekerja dengan beberapa perintah, tetapi tidak dengan yang lain? Bagaimana saya bisa menghindari masalah ini?
ls | echo
? mengapa tidak lari sajals
?git cat-file
, tetapi itu tidak berhasil. Tampaknya, gema memiliki perilaku yang sama, jadi saya menggunakannya sebagai contoh.Jawaban:
Ada perbedaan antara argumen baris perintah dan input standar. Sebuah pipa akan menghubungkan output standar dari satu proses ke input standar lainnya. Begitu
Menghubungkan output standar ls ke input standar echo. Baik kan? Yah, gema mengabaikan input standar dan akan membuang argumen baris perintahnya - yang tidak ada dalam kasus ini ke - stdout sendiri. Outputnya: tidak ada sama sekali.
Ada beberapa solusi dalam hal ini. Salah satunya adalah dengan menggunakan perintah yang membaca stdin dan dump ke stdout, seperti cat.
Akan 'bekerja', tergantung pada definisi pekerjaan Anda.
Tapi bagaimana dengan kasus umumnya. Yang Anda inginkan adalah mengonversi stdout dari satu perintah ke baris perintah yang lain. Seperti yang dikatakan orang lain,
xargs
adalah alat bantu kanonik dalam kasus ini, membaca baris perintahnya untuk meminta perintah dari stdinnya, dan menyusun perintah untuk dijalankan.Anda juga dapat mengonversi beberapa ini, menggunakan perintah substitusi
$()
Akan juga melakukan apa yang Anda inginkan.
Kedua alat ini cukup inti untuk skrip shell, Anda harus mempelajari keduanya.
Untuk kelengkapan, seperti yang Anda tunjukkan dalam pertanyaan, cara dasar lain untuk mengonversi stdin ke command line args adalah
read
perintah builtin shell . Itu mengkonversi "kata-kata" (kata-kata seperti yang didefinisikan olehIFS
variabel) ke variabel temp, yang dapat Anda gunakan dalam menjalankan perintah apa pun.sumber
ls | echo
mencetak hanya garis kosong karenaecho
tidak membaca input; perintah terakhir dari pipeline sebenarnya adalahecho
tidak mencetak apa-apa selain baris kosong.Umumnya:
memastikan bahwa output
a
menjadi input darib
. Saya sarankan Anda untuk membacaPipelines
bagianman bash
.Jika Anda benar-benar ingin menggunakan
ls
danecho
bersama - sama, inilah beberapa contoh (sangat tidak berguna):sumber
Jika Anda ingin
echo
yangls
perintah try:Ini akan memanggil
echo
dengan output darils
.sumber
ls | xargs -I {} echo {}
jika Anda ingin dipanggil untuk setiap baris secara individualMengapa tidak menggunakan saja:
Atau jauh lebih aman:
sumber
echo *
.