Tidak ada "aturan" seperti itu. Beberapa program menerima input dari STDIN, dan beberapa lainnya tidak. Jika suatu program dapat mengambil input dari STDIN, itu dapat disalurkan ke, jika tidak, itu tidak bisa.
Anda biasanya dapat mengetahui apakah suatu program akan mengambil input atau tidak dengan memikirkan apa yang dilakukannya. Jika pekerjaan program ini adalah untuk entah bagaimana memanipulasi isi dari file (misalnya grep, sed, awkdll), biasanya membutuhkan waktu masukan dari STDIN. Jika tugasnya adalah untuk memanipulasi file itu sendiri (misalnya mv, rm, cp) atau proses (misalnya kill, lsof) atau untuk informasi kembali tentang sesuatu (misalnya top, find, ps) maka tidak.
Cara lain untuk memikirkannya adalah perbedaan antara argumen dan input. Sebagai contoh:
mv foo bar
Pada perintah di atas, mvtidak memiliki input seperti itu. Apa yang telah diberikan adalah dua argumen. Itu tidak tahu atau peduli apa yang ada di salah satu file, hanya tahu itu adalah argumennya dan itu harus memanipulasi mereka.
Di samping itu
sed -e 's/foo/bar/' < file
--- -- ------------ ----
| | | |-> input
| | |------------> argument
| |--------------------> option/flag/switch
|------------------------> command
Di sini, sedtelah diberikan input sekaligus argumen. Karena membutuhkan input, ia dapat membacanya dari STDIN dan dapat disalurkan ke.
Semakin rumit ketika sebuah argumen bisa menjadi input. Sebagai contoh
cat file
Di sini, fileadalah argumen yang diberikan kepada cat. Lebih tepatnya, nama file fileadalah argumen. Namun, karena catmerupakan program yang memanipulasi isi file, inputnya adalah apa pun yang ada di dalamnya file.
Ini dapat diilustrasikan menggunakan strace, program yang melacak panggilan sistem yang dibuat oleh proses. Jika kita jalankan cat foovia strace, kita dapat melihat bahwa file foodibuka:
$ strace cat foo 2| grep foo
execve("/bin/cat", ["cat", "foo"], [/* 44 vars */]) = 0
open("foo", O_RDONLY)
Baris pertama di atas menunjukkan bahwa program /bin/catdipanggil dan argumennya adalah catdan foo(argumen pertama selalu merupakan program itu sendiri). Kemudian, argumen foodibuka dalam mode hanya baca. Sekarang, bandingkan dengan ini
$ 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
Di sini juga, lsmengambil sendiri dan foosebagai argumen. Namun, tidak ada openpanggilan, argumen tersebut tidak diperlakukan sebagai input. Sebaliknya, lspanggil statpustaka sistem (yang tidak sama dengan statperintah) untuk mendapatkan informasi tentang file tersebut foo.
Singkatnya, jika perintah yang Anda jalankan akan membaca inputnya, Anda bisa mem-pipe ke sana, jika tidak, Anda tidak bisa.
pgrep,pkilldankillallperintah.