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
, awk
etc.), 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, mv
n'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, sed
a é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 file
l'argument qui a été donné cat
. Pour être précis, le nom du fichier file
est l'argument. Cependant, comme il cat
s'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' strace
un programme qui suit les appels système effectués par les processus. Si nous exécutons cat foo
via strace
, nous pouvons voir que le fichier foo
est 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 cat
et 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, ls
s'est pris et foo
comme argument. Cependant, il n'y a pas d' open
appel, l'argument n'est pas traité comme une entrée. Au lieu de cela, ls
appelle la stat
bibliothèque du système (qui n'est pas la même chose que la stat
commande) 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
,pkill
et leskillall
commandes.