Il n'y a pas de "règles" en tant que telles. Certains programmes prennent des entrées de STDIN, et d'autres non. Si un programme peut recevoir des entrées de STDIN, il peut être dirigé vers, sinon, il ne le peut pas.
Vous pouvez normalement dire si un programme prendra ou non une contribution en réfléchissant à ce qu'il fait. Si le travail du programme est de manipuler en quelque sorte le contenu d'un fichier (par exemple grep, sed, awketc.), il faut normalement l' entrée STDIN. Si son travail consiste à manipuler le fichier lui - même (par exemple mv, rm, cp) ou d' un processus (par exemple kill, lsof) ou à l' information de retour sur quelque chose (par exemple top, find, ps) il ne fonctionne pas.
Une autre façon de penser à ce sujet est la différence entre les arguments et les entrées. Par exemple:
mv foo bar
Dans la commande ci-dessus, mvn'a pas d'entrée en tant que telle. Ce qui lui a été donné, ce sont deux arguments. Il ne sait ni ne se soucie de ce qui se trouve dans aucun des fichiers, il sait juste que ce sont ses arguments et il doit les manipuler.
D'autre part
sed -e 's/foo/bar/' < file
--- -- ------------ ----
| | | |-> input
| | |------------> argument
| |--------------------> option/flag/switch
|------------------------> command
Ici, seda été donné une entrée ainsi qu'un argument. Puisqu'il prend une entrée, il peut la lire depuis STDIN et il peut être redirigé vers.
Cela devient plus compliqué lorsqu'un argument peut être l'entrée. Par exemple
cat file
Voici filel'argument qui a été donné cat. Pour être précis, le nom du fichier fileest l'argument. Cependant, comme il cats'agit d'un programme qui manipule le contenu des fichiers, son entrée est tout ce qui se trouve à l'intérieur file.
Cela peut être illustré à l'aide d' straceun programme qui suit les appels système effectués par les processus. Si nous exécutons cat foovia strace, nous pouvons voir que le fichier fooest ouvert:
$ strace cat foo 2| grep foo
execve("/bin/cat", ["cat", "foo"], [/* 44 vars */]) = 0
open("foo", O_RDONLY)
La première ligne ci-dessus montre que le programme a /bin/catété appelé et ses arguments étaient catet foo(le premier argument est toujours le programme lui-même). Plus tard, l'argument a fooété ouvert en mode lecture seule. Maintenant, comparez cela avec
$ 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
Ici aussi, lss'est pris et foocomme argument. Cependant, il n'y a pas d' openappel, l'argument n'est pas traité comme une entrée. Au lieu de cela, lsappelle la statbibliothèque du système (qui n'est pas la même chose que la statcommande) pour obtenir des informations sur le fichier foo.
En résumé, si la commande que vous exécutez lira son entrée, vous pouvez y accéder, sinon, vous ne pouvez pas.
pgrep,pkillet leskillallcommandes.