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 ( STDINve STDOUThemen 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 STDINveya STDOUTbelirli bir türde işlem yapar. STDINve STDOUTartı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 catveriyi STDINokumayı başarır cat. Daha sonra cattüm içeriğini yazarfile_nameSTDIN , kabuğun manipülasyonu için talimat vermediğimizden, terminalin veya terminalinSTDOUT . İkinci satırda kabuğunuzun STDINbu şekilde manipüle ettiğini, artık standart giriş cihazınızı göstermediğini, ancak file_namegeç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 STDINboş bir dizi gibi bir argüman olmadan çağrıldığında bir . Yani çizgi
man < file_name
eşittir
man
Örneğin manbir şeyler okuyacak STDINgeçmek çok olursa, -l -hiç man. Komut satırında verilen bu seçenekle, manokunan 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 , STDOUTve 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_nameyapmak için kullandığınızdan bahsettiniz , ancak sistemimde aşağıdakilerle başarısız oluyor :manSTDINSTDERRman -l - < tee man: invalid option -- l man, version 1.6c