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
, awk
Vb.) 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 mv
bö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 sed
bir 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 file
verilen argüman cat
. Kesin olmak gerekirse, dosya adı file
bağımsız değişkendir. Bununla birlikte, cat
dosyaların içeriğini işleyen bir program olduğundan, girdisi içindeki her şeydir file
.
Bu, strace
işlemler tarafından yapılan sistem çağrılarını izleyen bir program kullanılarak gösterilebilir . Biz çalıştırırsanız cat foo
aracılığıyla strace
, biz dosya olduğunu görebilirsiniz foo
açı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/cat
denilen ve bağımsız değişkenleri idi cat
ve foo
(ilk değişken programın kendisi her zaman). Daha sonra, argüman foo
salt 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 ls
kendini ve foo
argüman olarak aldı . Ancak, open
çağrı yoktur , argüman girdi olarak değerlendirilmez. Bunun yerine, dosya hakkında bilgi almak ls
için sistemin stat
kitaplığını ( stat
komutla 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
,pkill
vekillall
komutlarına bir göz atmak isteyebilirsiniz .