Sorunuz, kullandığınız kabuğun komut satırındaki kullanıcı girdisini nasıl ayrıştırdığıyla yakından ilgilidir.
Komut satırındaki ilk sözcük, özel bir klasörde (çoğunlukla tarafından tanımlanır PATH
) bulunan bir programsa ve daha fazla özel karakter verilmiyorsa (kullandığınız kabuğa bağlı olarak), boşluk veya sekmeyle ayrılmış sonraki tüm sözcükler programı özel bir biçimde yani bir dizi. Her kelime dizide bir öğe olarak.
Programı nasıl çağıracağınız argümanları (dizide bulunur) nasıl programladığına bağlıdır. Argümanların sözdiziminin nasıl görünmesi gerektiğine dair bazı standartlar vardır, ancak genel olarak programcı tamamen ücretsizdir. Dolayısıyla ilk argüman bir dosya adı veya programın yazdığı sırada programcının düşünceleri ne olursa olsun yorumlanabilir.
Özel karakteri <
veya >
komut satırınıza eklemeniz durumunda , kabuk dos programa aktarılacak diziye eklenmez <
ve >
sonraki sözcükler eklenmez . Kabuk ile <
veya >
verilen kabuk, temel çekirdek (anahtar kelime boruları ) tarafından desteklenen süslü şeyler yapmaya başlar . Neler olduğunu kavramak için neyin ( STDIN
ve STDOUT
hemen ilgili olmadığı için STDERR
) atladığımı anlamalısınız .
Terminalinizde gördüğünüz her şey (çoğu durumda ekranınızın bir parçası) ya kabuk ya da daha önce özel bir dosyaya çağırdığınız başka bir program tarafından yazılır ( unix'te her şey bir dosyadır ). Bu dosya özel bir kimliğe sahiptir ve denir STDOUT
. Bir program klavyeden veri okumak istiyorsa, klavyeyi doğrudan yok etmez (en azından çoğu durumda), ancak adlı özel bir dosyadan okur STDIN
. Dahili olarak bu dosya standart giriş cihazınıza, çoğu durumda klavyenize bağlanır.
Kabuk okursa <
veya >
ayrıştırılmış bir komut satırında karşılık gelen programın çalıştığı süre boyunca STDIN
veya STDOUT
belirli bir türde işlem yapar. STDIN
ve STDOUT
artık terminale veya standart giriş cihazına değil, komut satırındaki sonraki dosya adına işaret etmeyin.
İki satır durumunda
cat file_name
cat < file_name
gözlemlenen davranış aynıdır çünkü karşılık gelen geliştirici , adı ilk komut satırı argümanı (kabuğun geçtiği dizideki ilk öğe olan) olarak verilen dosyadan veri okumayı veya cat
veriyi STDIN
okumayı başarır cat
. Daha sonra cat
tüm içeriğini yazarfile_name
STDIN
, kabuğun manipülasyonu için talimat vermediğimizden, terminalin veya terminalinSTDOUT
. İkinci satırda kabuğunuzun STDIN
bu şekilde manipüle ettiğini, artık standart giriş cihazınızı göstermediğini, ancak file_name
geçerli çalışma dizininizde çağrılan bir dosyayı gösterdiğini unutmayın.
Hattın diğer durumunda
man < file_name
man
hiçbir şey okumak istemiyor STDIN
boş bir dizi gibi bir argüman olmadan çağrıldığında bir . Yani çizgi
man < file_name
eşittir
man
Örneğin man
bir şeyler okuyacak STDIN
geçmek çok olursa, -l -
hiç man
. Komut satırında verilen bu seçenekle, man
okunan her şeyin içeriğini görüntüleyebilirsinizSTDIN
terminalinizde . Yani
man -l - < file_name
ayrıca çalışır (ama dikkatli ol man
, yalnızca bir çağrı cihazı değildir, aynı zamanda dosyanın girişini ayrıştırır ve böylece dosya içeriği ve görüntülenen içerik farklı olabilir).
Nasıl STDIN
, STDOUT
ve komut satırı argümanları yorumlanır gelen geliştirici tüm kalmıştır.
Umarım cevabım bazı şeyleri temizleyebilir.
man -l - < file_name
yapmak için kullandığınızdan bahsettiniz , ancak sistemimde aşağıdakilerle başarısız oluyor :man
STDIN
STDERR
man -l - < tee man: invalid option -- l man, version 1.6c