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 STDINdan 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 STDINatau STDOUTdalam jenis tertentu untuk saat program terkait berjalan. STDINdan tidak STDOUTmenunjuk 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 catuntuk membaca data dari STDINatau membaca data dari file, yang namanya diberikan sebagai argumen baris perintah pertama (yang merupakan elemen pertama dalam larik yang dilewati shell cat). Selanjutnya cattulis seluruh konten file_nameatau STDINke terminal karena kami tidak menginstruksikan shell untuk memanipulasi STDOUT. Ingat bahwa pada baris kedua shell Anda memanipulasi STDINdengan cara ini, bahwa shell tidak mengarah ke perangkat input standar Anda lagi tetapi menunjuk ke file yang disebut file_namedi direktori kerja Anda saat ini.
Dalam kasus lain dari garis
man < file_name
mantidak dimaksudkan untuk membaca apa pun dari STDINjika dipanggil tanpa argumen yaitu array kosong. Jadi intinya
man < file_name
sama dengan
man
Misalnya manakan 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 mandibaca dari STDINterminal Anda. Begitu
man -l - < file_name
akan bekerja juga (tapi hati-hati manbukan hanya pager tetapi juga mem-parsing input file dan konten file dan konten yang ditampilkan bisa berbeda).
Jadi bagaimana STDIN, STDOUTdan argumen baris perintah ditafsirkan semuanya terserah pengembang yang sesuai.
Saya harap jawaban saya dapat menjelaskan semuanya.
man -l - < file_nameuntuk membuatmanpenafsiranSTDINsebagai argumen, tetapi gagal dalam sistem saya denganSTDERR:man -l - < tee man: invalid option -- l man, version 1.6c