Böyle bir "kural" yoktur. Bazı programlar STDIN'den girdi alır, bazıları almaz. Bir program STDIN'den girdi alabilirse, yapılamaz.
Normalde bir programın ne yapılacağını düşünerek girdi alıp almayacağını anlayabilirsiniz. Programın işi bir şekilde bir dosyanın içeriğini (ör grep. sed, awkVb.) Değiştirmekse, normalde STDIN'den girdi alır. Onun iş dosyasını kendisi (örn işlemek için ise mv, rm, cp) ya da bir işlem (örneğin kill, lsof) ya da bir şey hakkında geri dönüş bilgilere (örneğin top, find, ps) daha sonra öyle değil.
Bunu düşünmenin bir başka yolu da argümanlar ve girdi arasındaki farktır. Örneğin:
mv foo bar
Yukarıdaki komutta mvböyle bir girdi yok. Verilen iki argüman. Her iki dosyada da ne olduğunu bilmiyor ya da umursamıyor, sadece bunların argümanları olduğunu biliyor ve onları manipüle etmeli.
Diğer yandan
sed -e 's/foo/bar/' < file
--- -- ------------ ----
| | | |-> input
| | |------------> argument
| |--------------------> option/flag/switch
|------------------------> command
Burada sedbir argümanın yanı sıra girdi verilmiştir. Girdi aldığı için STDIN'den okuyabilir ve pipetlenebilir.
Bir argüman olabilir zaman daha karmaşık bir hal alıyor olması girişi. Örneğin
cat file
Burada fileverilen argüman cat. Kesin olmak gerekirse, dosya adı file bağımsız değişkendir. Bununla birlikte, catdosyaların içeriğini işleyen bir program olduğundan, girdisi içindeki her şeydir file.
Bu, straceişlemler tarafından yapılan sistem çağrılarını izleyen bir program kullanılarak gösterilebilir . Biz çalıştırırsanız cat fooaracılığıyla strace, biz dosya olduğunu görebilirsiniz fooaçılır:
$ strace cat foo 2| grep foo
execve("/bin/cat", ["cat", "foo"], [/* 44 vars */]) = 0
open("foo", O_RDONLY)
Gösterir yukarıdaki ilk satır programı bu /bin/catdenilen ve bağımsız değişkenleri idi catve foo(ilk değişken programın kendisi her zaman). Daha sonra, argüman foosalt okunur modda açıldı. Şimdi bunu karşılaştırın
$ strace ls foo 2| grep foo
execve("/bin/ls", ["ls", "foo"], [/* 44 vars */]) = 0
stat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
lstat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
write(1, "foo\n", 4foo
Burada da lskendini ve fooargüman olarak aldı . Ancak, opençağrı yoktur , argüman girdi olarak değerlendirilmez. Bunun yerine, dosya hakkında bilgi almak lsiçin sistemin statkitaplığını ( statkomutla aynı şey değildir) çağırır foo.
Özetle, çalıştırdığınız komut girdisini okuyacaksa, buna yönlendirebilirsiniz, eğer yapmazsa yapamazsınız.
pgrep,pkillvekillallkomutlarına bir göz atmak isteyebilirsiniz .