Untuk beberapa perintah, dimungkinkan untuk menentukan input tertentu sebagai stdin atau argumen baris perintah.
Secara khusus, misalkan command
dapat mengambil input stdin dan nama file sebagai argumen baris perintah, dan command < myfile
, cat myfile | command
dan command myfile
dapat menghasilkan hasil yang sama.
Sebagai contoh,
Ketika perintahnya adalah sed
:
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
Ketika perintahnya adalah cat
:
cat < myfile
cat myfile
- Saya bertanya-tanya apakah ada beberapa aturan umum tentang penampilan mereka, yaitu mana yang biasanya paling efisien, dan yang paling tidak?
- Apakah pengalihan selalu lebih baik daripada pipa?
Jawaban:
The
cat file | command
sintaks dianggap sebagai Gunakan Useless dariCat
. Dari semua opsi Anda, dibutuhkan kinerja yang baik karena harus memunculkan proses lain di kernel. Betapapun tidak signifikannya ini ternyata dalam gambaran besar, itu di atas kepala yang tidak dimiliki bentuk-bentuk lain. Ini telah dibahas pada pertanyaan seperti: Haruskah saya peduli dengan kucing yang tidak perlu?Antara dua bentuk lainnya hampir tidak ada perbedaan kinerja. STDIN adalah simpul file khusus yang harus dibuka dan dibaca sama seperti yang lain. Melewati nama file bukannya STDIN hanya membuatnya membuka file yang berbeda.
Perbedaannya terletak pada fitur / fleksibilitas apa yang Anda cari.
sed -i
untuk pengeditan di tempat. (Catatan: karena ini harus membuat file baru di belakang layar, itu bukan keuntungan kinerja dari pengalihan lain tetapi itu adalah langkah yang mudah.)sed [exp] < file1 file2
atau bahkansed [exp] < <(grep command)
. Rincian kasus penggunaan ini dapat ditemukan pada pertanyaan ini: Proses penggantian dan pipasumber
sed [exp] < <(grep command)
akan berfungsi dengan baiksed [exp] <(grep command)
(karena<(grep command)
membuat file sementara bernama untuk panjang perintah yangsed
benar-benar mampu membuka sendiri tanpa bantuan shell).Mengingat bahwa
command file
hanya membuka file dan sejak saat itu berfungsi seperti jika itustdin
, ada sedikit perbedaan. Dengan pengalihan shell Anda hanya membuka file sebelumnya (shell tidak,) sebagai lawan dari perintah biner itu sendiri.Jika kita berbicara tentang
cat file | command
vs.command <file
, maka yang terakhir lebih disukai. Anda tidak akan melihat perbedaan kinerja yang signifikan antara keduanya, tetapi yang pertama tidak perlu rumit (proses tambahan dan buffer memori bersama untuk pipa, dengan throughput terbatas.) Juga, Anda tidak bisaseek
(mengubah posisi penunjuk file secara sewenang-wenang) dalam pipa, sementara Anda bisa dalam file biasa. Beberapa perintah mungkin menggunakan algoritma yang lebih efisien ketikaseek
dimungkinkan dalam file input.sumber
<file
? Poin Anda valid untuk menggunakan nama file input untuk mendapatkan tangguh nama file output, misalnya:gzip file
menghasilkanfile.gz
.close
sstdin
dan memanggildup
deskriptor file yang dibuka, sehingga menggantikan yang lamastdin
(yang merupakan semacam tty dalam kebanyakan kasus.) Dari sudut pandang pemain film tidak ada perbedaan antara itu dan membuka file dengan nama itu di pemain itu sendiri. Deskriptor file dapat dicari di kedua skenario, jadi ketika kita lewati sampai akhir tidak ada perbedaan yang dapat dideteksi pengguna.