Pertanyaan Anda terkait erat dengan bagaimana shell yang Anda gunakan mem-parsing input pengguna pada baris perintah.
Jika kata pertama pada baris perintah adalah program, yang terletak di folder khusus (sebagian besar ditentukan oleh PATH
) dan tidak ada karakter khusus yang diberikan (tergantung dari shell yang Anda gunakan), semua kata berikutnya yang dipisahkan oleh spasi atau tab dilewatkan ke program dalam bentuk khusus yaitu array. Dengan setiap kata sebagai satu elemen dalam array.
Bagaimana programnya, Anda akan memohon interpretasi argumen (terletak di array) tergantung pada bagaimana diprogram. Ada beberapa standar kuasi tentang bagaimana sintaks dari argumen seharusnya terlihat tetapi secara umum programmer sepenuhnya bebas. Jadi argumen pertama dapat diartikan sebagai nama file atau apa pun yang dipikirkan oleh programmer pada saat ia menulis program.
Jika Anda menambahkan karakter khusus <
atau >
ke baris perintah Anda, shell tidak menambahkan <
dan >
kata-kata berikutnya ke array yang akan diteruskan ke program. Dengan <
atau >
diberi shell mulai membuat hal-hal mewah, didukung oleh kernel yang mendasarinya (kata kunci pipa ). Untuk memahami apa yang terjadi, Anda harus memahami apa STDIN
dan STDOUT
(karena itu tidak terkait langsung saya hilangkan STDERR
).
Semua yang terlihat Anda lihat di terminal Anda (dalam sebagian besar kasus bagian dari tampilan Anda) ditulis oleh shell atau program lain yang Anda panggil sebelumnya ke file khusus (dalam unix semuanya adalah file ). File ini memiliki id khusus dan dipanggil STDOUT
. Jika suatu program ingin membaca data dari papan ketik, program itu tidak melakukan polling papan ketik secara langsung (setidaknya dalam kebanyakan kasus) tetapi membaca dari berkas khusus yang disebut STDIN
. Secara internal file ini terhubung ke perangkat input standar Anda, keyboard Anda dalam banyak kasus.
Jika shell membaca <
atau >
dalam baris perintah yang diuraikan, ia memanipulasi STDIN
atau STDOUT
dalam jenis tertentu untuk saat program terkait berjalan. STDIN
dan tidak STDOUT
menunjuk ke terminal atau perangkat input standar lagi tetapi lebih ke nama file berikutnya pada baris perintah.
Dalam hal dua garis
cat file_name
cat < file_name
perilaku yang diamati identik karena pengembang yang bersesuaian membuat cat
untuk membaca data dari STDIN
atau membaca data dari file, yang namanya diberikan sebagai argumen baris perintah pertama (yang merupakan elemen pertama dalam larik yang dilewati shell cat
). Selanjutnya cat
tulis seluruh konten file_name
atau STDIN
ke terminal karena kami tidak menginstruksikan shell untuk memanipulasi STDOUT
. Ingat bahwa pada baris kedua shell Anda memanipulasi STDIN
dengan cara ini, bahwa shell tidak mengarah ke perangkat input standar Anda lagi tetapi menunjuk ke file yang disebut file_name
di direktori kerja Anda saat ini.
Dalam kasus lain dari garis
man < file_name
man
tidak dimaksudkan untuk membaca apa pun dari STDIN
jika dipanggil tanpa argumen yaitu array kosong. Jadi intinya
man < file_name
sama dengan
man
Misalnya man
akan membaca sesuatu dari STDIN
, juga jika Anda lulus -l -
ke man
. Dengan opsi ini diberikan pada baris perintah, Anda dapat menampilkan konten apa pun yang man
dibaca dari STDIN
terminal Anda. Begitu
man -l - < file_name
akan bekerja juga (tapi hati-hati man
bukan hanya pager tetapi juga mem-parsing input file dan konten file dan konten yang ditampilkan bisa berbeda).
Jadi bagaimana STDIN
, STDOUT
dan argumen baris perintah ditafsirkan semuanya terserah pengembang yang sesuai.
Saya harap jawaban saya dapat menjelaskan semuanya.
man -l - < file_name
untuk membuatman
penafsiranSTDIN
sebagai argumen, tetapi gagal dalam sistem saya denganSTDERR
:man -l - < tee man: invalid option -- l man, version 1.6c