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
, awk
dll), 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, mv
tidak 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, sed
telah 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, file
adalah argumen yang diberikan kepada cat
. Lebih tepatnya, nama file file
adalah argumen. Namun, karena cat
merupakan 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 foo
via strace
, kita dapat melihat bahwa file foo
dibuka:
$ 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/cat
dipanggil dan argumennya adalah cat
dan foo
(argumen pertama selalu merupakan program itu sendiri). Kemudian, argumen foo
dibuka 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, ls
mengambil sendiri dan foo
sebagai argumen. Namun, tidak ada open
panggilan, argumen tersebut tidak diperlakukan sebagai input. Sebaliknya, ls
panggil stat
pustaka sistem (yang tidak sama dengan stat
perintah) 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
,pkill
dankillall
perintah.