Misalkan saya ingin menghapus semua file dalam direktori kecuali untuk yang bernama "notes.txt". Saya akan melakukan ini dengan pipa ls | grep -v "notes.txt" | xargs rm
,. Mengapa saya perlu xargs jika output dari pipa kedua adalah input yang harus digunakan rm?
Demi perbandingan, pipeline, echo "#include <knowledge.h>" | cat > foo.c
menyisipkan teks yang digaungkan ke dalam file tanpa menggunakan xargs. Apa perbedaan antara kedua jalur pipa ini?
ls | grep -v "notes.txt" | xargs rm
untuk menghapus semuanya kecualinotes.txt
, atau secara umum, tidak pernah menguraikanls
output . Perintah Anda akan rusak jika satu file berisi spasi, misalnya. Cara yang lebih aman adalahrm !(notes.txt)
di Bash (denganshopt -s extglob
set), ataurm ^notes.txt
di Zsh (denganEXTENDED_GLOB
) dll.find . -maxdepth 1 -mindepth 1 -print0 | xargs -0
alih - alihls | xargs
:-)Jawaban:
Anda membingungkan dua jenis input yang sangat berbeda: STDIN dan argumen. Argumen adalah daftar string yang disediakan untuk perintah saat dimulai, biasanya dengan menentukan mereka setelah nama perintah (misalnya
echo these are some arguments
ataurm file1 file2
). STDIN, di sisi lain, adalah aliran byte (kadang-kadang teks, kadang-kadang tidak) yang perintahnya dapat (secara opsional) membaca setelah dimulai. Berikut adalah beberapa contoh (catatan yangcat
dapat mengambil argumen atau STDIN, tetapi ada bedanya dengan mereka):xargs
dapat dianggap sebagai mengubah input gaya STDIN ke argumen:echo
sebenarnya melakukan lebih atau kurang sebaliknya: ia mengubah argumennya menjadi STDOUT (yang dapat disalurkan ke STDIN beberapa perintah lain):sumber
cat
menerima input dariSTDIN
danrm
tidak. Untuk perintah seperti itu Anda perluxargs
mengulang melaluiSTDIN
baris demi baris dan menjalankan perintah dengan parameter baris perintah.sumber