STDIN ile komuta iletilen argümanlar arasındaki fark nedir?


16

Ben catyöntemi çalıştırmak için her iki formu kullanabilirsiniz :

cat file_name
cat < file_name

Sonuç aynı

Sonra manşu formatta yürütmek istiyorumstdin

man < file_name

Iken file_nameşunları içerir:

# file_name
cat

Ama What manual page do you want?yürütmek yerine açılır man cat.

Neden argüman olarak catkabul stdinedilebildiğini bilmek istemiyorum man. Ve komut satırı argümanları ile arasındaki fark stdinnedir?

Yanıtlar:


21

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.


Bu ayrıntılı açıklama için teşekkürler. Son birkaç paragrafınız için, argüman olarak yorum 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
steveyang

Rica ederim. Ama en azından benim man( man-db ) versiyonumun STDINverilen argümanlarla argümanları okuduğundan bahsetmedim-l izledi -. Sadece verileri STDINbir man sayfası olarak yorumlar. Geçerli argümanların ve bunların nasıl yorumlandığının daha ayrıntılı açıklamaları için ilgili programın kılavuz sayfasına başvurmanız gerekir. Sizin durumunuzda danışın man man. Belki de sizin için benzer bir seçenek var man. Belirli bir program için komut satırı argümanlarını okumak istiyorsanız STDIN xargs(yukarıda belirtildiği gibi) gitmek için bir yoldur.
user1146332

Ben man manve işletim sistemimdeki olanı desteklemiyor. Her neyse, bu iki kavramın benim için bu beyanı için teşekkürler.
steveyang

Cevabınızı, lmgtfy yerine gerçekten yararlı bağlantılar içerecek şekilde düzenledim. Lmgtfy bağlantıları yayınlamak 1) kaba, 2) yararsızdır ve 3) gerçekten SE sitelerinde kaşlarını çattı . Ya bir bağlantı sağlayın ya da vermeyin, ancak bunu yapmayı seçerseniz, birisine nasıl bulacağını göstermenin alaycı bir yoluna değil, gerçek bilgilere bir bağlantı sağlayın.
terdon

12

Tamamen farklılar. Komut satırı argümanları bir dizide programa iletilir ve onlarla istediklerini yapabilir; stdin, programın veri istemesi gereken bir girdi akışıdır. Dosyaları işleyen programlar genellikle her ikisini de desteklemeyi seçer, ancak bunu manuel olarak yapmak zorundadırlar - bir dosya adının komut satırı argümanı olarak iletilip iletilmediğini kontrol ederler ve bunun yerine stdin'den okumuyorlarsa

Sen bekliyor gibi görünüyor mangerçekten garip bir davranış olur o göstermeli adam sayfasını bulmak için Stdin okumak için; bunu ne zaman kullanırsın Aslında catonun Stdin görüntüler o başka hiçbir şey yapmaz gerçeği bir eserdir; Başka hiçbir aracın bu şekilde çalıştığını düşünmüyorum. Örneğin, grepbir dosya adı alabilir veya buradan okunabilir stdin, ancak üzerindeki verileri işler, stdinbir dosya adını okumaz stdinve sonra açar.

Bu davranışa gerçekten ihtiyacınız varsa xargs, bir dosyayı komut satırı bağımsız değişkenlerine dönüştüren şunu kullanabilirsiniz :

$ xargs man < file_name

Veya sadece bir catçağrıyı çağrıya gömün man:

$ man $(cat file_name)

Bash'da kullanabilirsiniz man $(<file_name).
jordanm

Re: "Ben başka bir araç bu şekilde çalışır sanmıyorum" - Perl's (<>)bir döngü yapacak STDINveya dosya adı olarak komut satırı argümanları ...
Aaron D. Marasco

@ AaronD.Marasco Hiçbir aracın ya bir argüman alması ya da stdin'den bir dosya adı okuması ve bu dosyadan argümanı okuması anlamına geliyordum
Michael Mrozek

@MichaelMrozek Bu açıklama için teşekkürler. Kullandığım amaç man < file_namekendime bu iki kavramı anlamama yardımcı olmak. Size açıklamayı okuyarak, uygulamaya komut yazarı karar verir. Eğer haklıysam, findargümanlar alır STDIN'i işler mi?
steveyang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.