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
man
( man-db ) membaca argumen dariSTDIN
dengan argumen yang diberikan-l
diikuti oleh-
. Itu hanya menafsirkan data dariSTDIN
sebagai halaman manual. Untuk penjelasan lebih rinci tentang argumen yang valid dan bagaimana mereka ditafsirkan, Anda harus membaca halaman manual dari program terkait. Dalam kasus Anda, konsultasikanman man
. Mungkin ada opsi serupa untuk Andaman
. Jika Anda ingin membaca argumen baris perintah untuk program tertentu dariSTDIN
xargs
(seperti disebutkan di atas) adalah cara untuk pergi.man man
dan menemukan satu di OS saya tidak mendukungnya. Bagaimanapun, terima kasih atas pernyataan kedua konsep ini untuk saya.Mereka sangat berbeda. Argumen baris perintah dilewatkan ke program dalam array dan ia dapat melakukan apa yang diinginkannya; stdin adalah aliran input dari program untuk meminta data. Program yang memproses file sering memilih untuk mendukung keduanya, tetapi mereka harus melakukannya secara manual - mereka memeriksa apakah nama file dilewatkan sebagai argumen baris perintah, dan jika tidak mereka membaca dari stdin sebagai gantinya
Anda tampaknya mengharapkan
man
untuk membaca stdin untuk menemukan halaman manual yang seharusnya ditampilkan, yang akan menjadi perilaku yang sangat aneh; kapan kamu akan menggunakannya? Fakta yangcat
menampilkan stdin adalah artefak dari fakta bahwa ia tidak melakukan hal lain; Saya tidak berpikir alat lain bekerja seperti itu. Misalnya,grep
dapat mengambil nama file atau membaca daristdin
, tetapi memproses datastdin
, tidak membaca nama file daristdin
dan kemudian membukanyaJika Anda benar-benar membutuhkan perilaku ini, Anda bisa menggunakan
xargs
, yang mengkonversi file ke argumen baris perintah:Atau hanya menyematkan
cat
panggilan dalamman
panggilan:sumber
man $(<file_name)
.(<>)
dalam satu lingkaran akan melakukanSTDIN
atau argumen baris perintah sebagai nama file ...man < file_name
adalah untuk membantu diri saya memahami dua konsep ini. Membaca penjelasan Anda, implementasi diputuskan oleh penulis perintah. Jadi jika saya di bawah kanan,find
argumen yang dibutuhkan agak memproses STDIN?