Untuk memperluas jawaban @Alex Gitelman:ya, ada perbedaan antara "input standar" dan baris perintah.
Saat Anda mengetik rm a.txt b.txt c.txt
, file yang Anda cantumkan setelah rm
dikenal sebagai argumen dan tersedia untuk rm melalui variabel khusus (disebut argv
secara internal). Input standar, sebaliknya, terlihat pada program Unix seperti file bernama stdin
. Suatu program dapat membaca data dari "file" ini seperti jika membuka file biasa di disk dan membaca dari situ.
rm
, seperti banyak program lainnya, mengambil argumennya dari baris perintah tetapi mengabaikan masukan standar. Anda dapat menyalurkan apa pun yang Anda suka; itu hanya akan membuang data itu. Di situlah xargs
berguna. Itu membaca baris pada input standar dan mengubahnya menjadi argumen baris perintah, sehingga Anda dapat menyalurkan data secara efektif ke baris perintah dari program lain. Itu trik yang rapi.
Misalnya:
find . -name ".txt" | xargs rm
find . -name ".txt" | grep "foo" | xargs rm
Perhatikan bahwa ini akan bekerja secara tidak benar jika ada nama file yang berisi baris baru atau spasi. Untuk menangani nama file yang berisi baris baru atau spasi, Anda harus menggunakan:
find . -name ".txt" -print0 | xargs -0 rm
Ini akan memberi tahu find
untuk mengakhiri hasil dengan karakter null alih-alih baris baru. Namun, grep
tidak akan berfungsi seperti sebelumnya. Sebagai gantinya gunakan ini:
find . -name ".txt" | grep "foo" | tr "\n" "\0" | xargs -0 rm
Kali ini tr
digunakan untuk mengubah semua baris baru menjadi karakter nol.
"mengapa saya tidak dapat mengirimkan hasil pencarian ke rm?"
Saat Anda mem-pipe sesuatu ke suatu program, pipa tersebut menggantikan input keyboard. Ingatlah hal ini dan tanyakan pada diri Anda pertanyaan berikutnya:Apa yang akan rm
lakukan dengan keyboard? Hapus penekanan tombol Anda ? (agak konyol memang) Menerima kontrol interaktif? (rm
tidak interaktif kecuali kadang-kadang membutuhkan konfirmasi, yang memang bisa diberikan melalui pipa.)
Faktanya, ketika rm
sudah berjalan, Anda tidak dapat mengetikkan perintah untuk membiarkannya menghapus file....jadi Anda juga tidak dapat melakukannya dengan pipa.
Jika Anda ingat bahwa pipa menggantikan kombinasi keyboard/layar, semuanya akan segera tampak lebih logis.
Sekarang sebaliknya. Anda dapat menyalurkan datastream ke grep
.Apakah itu berarti Anda dapat membiarkan grep membaca penekanan tombol dari keyboard Anda sebagai data masukan?
YA! Itulah sebenarnya yang dilakukannya secara native (tanpa perpipaan).
(b.t.w. perhatikan bahwa Anda tidak dapat menyalurkan atau mengetikkan argumen pencarian ke grep
)
Jadi sekarang Anda tahu mengapa Anda tidak bisa pipa ke rm dan mengharapkannya berfungsi sebagai argumen baris perintah.
tl;dr :
Anatomi program menurut filosofi UNIX:
masukkan, keluarkan, keyboard masuk, keluarkan layar. -> Pipa hanya mengganti keyboard dan layar.
Pipa mengirimkan output dari perintah pertama ke input standar kedua. rm
tidak menerima input standar sehingga Anda tidak dapat menyalurkannya. Anda bisa menggunakan xargs
untuk mencapai efek yang sama. Anda dapat menemukan contoh untuk xargs
khusus untuk kasus Anda di halaman manual untuk xargs.