Per definisi manusia, perintah ini mendapat input dari file.
$ command -r FILENAME
Misalkan itu FILENAME
adalah file yang berisi daftar nama file, seperti yang dihasilkan menggunakan ls > FILENAME
.
Bagaimana saya bisa, sebaliknya, memberi makan perintah dengan hasil ls
langsung? Di kepalaku sesuatu seperti ini seharusnya dimungkinkan:
$ ls | command -r
Tapi tidak, output dari ls
tidak ketagihan sebagai argumen. Keluaran:
Usage: command -r FILENAME
error: -r option requires an argument
Bagaimana saya bisa mendapatkan efek yang diinginkan?
Jawaban:
Ini tergantung pada perintah. Beberapa perintah yang membaca dari file berharap bahwa file tersebut adalah file biasa, yang ukurannya diketahui sebelumnya, dan yang dapat dibaca dari posisi apa pun dan diputar ulang. Ini tidak mungkin jika isi file adalah daftar nama file: maka perintah mungkin akan puas dengan sebuah pipa yang hanya akan dibaca secara berurutan dari awal hingga selesai. Ada beberapa cara untuk memberi makan data melalui pipa ke perintah yang mengharapkan nama file.
Banyak perintah memperlakukan
-
sebagai nama khusus, artinya membaca dari input standar daripada membuka file. Ini adalah konvensi, bukan kewajiban.Banyak varian unix yang menyediakan file khusus untuk
/dev
mendeskripsi deskriptor standar. Jika/dev/stdin
ada, membukanya dan membaca darinya setara dengan membaca dari input standar; demikian juga/dev/fd/0
jika itu ada.Jika shell Anda adalah ksh, bash atau zsh, Anda dapat membuat shell menangani urusan mengalokasikan beberapa deskriptor file. Keuntungan utama dari metode ini adalah tidak terikat dengan input standar, sehingga Anda dapat menggunakan input standar untuk hal lain, dan Anda dapat menggunakannya lebih dari sekali.
Jika perintah mengharapkan nama memiliki bentuk tertentu (biasanya ekstensi tertentu), Anda dapat mencoba membodohinya dengan tautan simbolis.
Atau Anda bisa menggunakan pipa bernama.
Perhatikan bahwa membuat daftar file dengan
ls
masalah karenals
cenderung untuk mengurai nama file ketika mengandung karakter yang tidak diinginkan.printf '%s\n' *
lebih dapat diandalkan - itu akan mencetak setiap byte secara harfiah dalam nama file. Nama file yang mengandung baris baru masih akan menyebabkan masalah, tetapi itu tidak dapat dihindari jika perintah mengharapkan daftar nama file yang dipisahkan oleh baris baru.sumber
Harus:
Edit: untuk nama dengan spasi kosong:
sumber
command
percaya ia memiliki semua nama file yang dibutuhkan pada baris perintah sekaligus. Beberapa versi xargs akan memberikancommand
beberapa nama file (10, menurut saya) sekaligus. Sepertinya GNU xargs memberikan semuanya sekaligus.Sebenarnya, satu-satunya solusi andal yang saya tahu yang dapat menangani semua nama file, termasuk yang memiliki baris baru di dalamnya, adalah:
Satu-satunya karakter yang tidak diperbolehkan dalam nama file dalam kasus ini adalah karakter nol, yang tidak diperbolehkan dalam nama file.
sumber
Banyak perintah menerima
-
sebagai "nama file" yang berarti "menggunakan input standar", tetapi konvensi ini jauh dari universal. Baca halaman manual.sumber
Ini harus berfungsi untuk tujuan Anda:
ls | command -r /dev/stdin
sumber