Saya tidak begitu mengerti bagaimana pipa bekerja di bash.
Saya tahu bahwa dibutuhkan output dari satu perintah sebagai input pada perintah lain.
Apa output yang bisa saya dapatkan karena itulah yang dicetak perintah ke layar.
Tapi bagaimana saya tahu input apa yang akan diambil perintah?
Berikut adalah contoh yang menurut saya akan berhasil:
which gem | rm
Sayangnya tidak.
Permata mana yang mencetak /usr/bin/gem
sehingga harus menjadi output, kan?
Saya pikir itu diberikan kepada rm jadi itu akan terjadi rm /usr/bin/gem
tetapi saya salah.
Jadi pertanyaan saya adalah, bagaimana saya tahu input apa yang diambil perintah?
rm /usr/bin/gem
adalah ide yang mengerikan . Biarkan itugem
(dan interpreter Ruby sesuai dengan itu) sendiri dan instal interpreter Ruby pilihan Anda (dangem
) menggunakanrvm
: rvm.beginrescueend.comJawaban:
"Input" dan "argumen baris perintah" adalah hal yang berbeda.
rm
menghapus file yang disediakan sebagai argumen.Sebuah pipa mengalihkan output dari perintah tangan kiri ke input dari perintah tangan kanan. Itu tidak mempengaruhi argumen baris perintah dari program di sebelah kanan.
Untuk melakukan apa yang Anda coba lakukan, coba gunakan
xargs
untuk mengkonversi input standar ke argumen baris perintah untuk menjalankan program. Itu tugasnya.which gem | xargs rm
, misalnya, akan menghapusgem
di PATH Anda.sumber
rm
tidak menerima input, dibutuhkan argumen. Ini berbeda. Argumen adalah sakelar dan nama file dan sebagainya yang Anda berikan ke program pada baris perintah untuk memengaruhi perilakunya. Input adalah data tempat program bekerja. Misalnya,grep
ambil input dan argumen:Ada dua argumen di sana
"foo"
danfile.txt
. The masukan adalah isi darifile.txt
, bukan stringfile.txt
itu sendiri. Karena grep mengambil input, Anda dapat menggunakannya dengan pipa:menghasilkan output yang sama, karena kucing adalah mengambil
file.txt
sebagai argumen, dan memproduksi isi darifile.txt
output. Keluaran itu kemudian disalurkan ke grep, memberikan efek yang sama seperti memiliki grep membuka file itu sendiri, seperti pada contoh pertama.Jika Anda ingin menggunakan output dari satu program sebagai argumen yang lain, Anda menggunakan backticks:
atau sintaks alternatif ini (khusus bash):
Edit: atau
xargs
seperti yang ditunjukkan penjawab lain. Banyak cara menguliti kucing dengan baris perintah.sumber
cat file.txt | grep "foo"
bisa ratusan kali lebih lambat daripadagrep "foo" file.txt
.grep --help
tinjauan umum singkat dari argumen yang diterima.Periksa
man
halaman - halaman perintah yang Anda minati. Program-program ini akan menunjukkan bahwa mereka membaca daristdin
(cobaman grep
untuk perintah populer yang membaca stdin).sumber
man grep | grep 'standard input'
dan menjadiIf no file arguments are specified, the standard input is used.
pertandingan terakhir. 👍 Saya harus memberigrep
sedikit rasa obatnya sendiri. 😎Ini semua berbahaya untuk dijalankan jika Anda memiliki direktori di PATH Anda yang berisi ruang atau jika nama perintah berisi ruang:
GNU Parallel http: // www.gnu.org/software/parallel/ tidak memiliki masalah itu, jadi ini akan berfungsi bahkan jika Anda memiliki direktori di PATH Anda yang berisi spasi atau jika nama perintah mengandung spasi:
Tonton video intro untuk GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ
sumber