Es gibt keine "Regeln" als solche. Einige Programme nehmen Eingaben von STDIN entgegen, andere nicht. Wenn ein Programm Eingaben von STDIN entgegennehmen kann, kann es weitergeleitet werden, wenn nicht, kann es nicht.
Normalerweise können Sie feststellen, ob ein Programm Eingaben akzeptiert oder nicht, indem Sie darüber nachdenken, was es tut. Wenn die Aufgabe des Programms ist es , irgendwie die zu manipulieren Inhalt einer Datei (zB grep
, sed
, awk
etc.), dauert es normalerweise eine Eingabe von STDIN. Wenn seine Aufgabe ist es, die Datei selbst (zB zu manipulieren mv
, rm
, cp
) oder ein Verfahren (zB kill
, lsof
) oder Rückkehr Informationen über etwas (zB top
, find
, ps
) , dann tut es nicht.
Eine andere Art, darüber nachzudenken, ist der Unterschied zwischen Argumenten und Eingaben. Beispielsweise:
mv foo bar
Hat im obigen Befehl mv
keine Eingabe als solche. Was gegeben wurde, sind zwei Argumente. Es weiß oder kümmert sich nicht darum, was sich in einer der Dateien befindet, es weiß nur, dass dies die Argumente sind, und es sollte sie manipulieren.
Auf der anderen Seite
sed -e 's/foo/bar/' < file
--- -- ------------ ----
| | | |-> input
| | |------------> argument
| |--------------------> option/flag/switch
|------------------------> command
Hier wurde sed
Input sowie ein Argument gegeben. Da es Eingaben akzeptiert, kann es diese von STDIN lesen und weitergeleitet werden.
Es wird noch komplizierter , wenn ein Argument sein , der Eingang. Beispielsweise
cat file
Hier file
ist das Argument, das gegeben wurde cat
. Um genau zu sein, der Dateiname file
ist das Argument. Da es sich jedoch cat
um ein Programm handelt, das den Inhalt von Dateien manipuliert, erfolgt die Eingabe nach dem Inhalt file
.
Dies kann mit strace
einem Programm veranschaulicht werden , das die von Prozessen ausgeführten Systemaufrufe nachverfolgt. Wenn wir cat foo
via ausführen strace
, können wir sehen, dass die Datei foo
geöffnet ist:
$ strace cat foo 2| grep foo
execve("/bin/cat", ["cat", "foo"], [/* 44 vars */]) = 0
open("foo", O_RDONLY)
Die erste Zeile oben zeigt, dass das Programm /bin/cat
aufgerufen wurde und seine Argumente cat
und waren foo
(das erste Argument ist immer das Programm selbst). Später wurde das Argument foo
im schreibgeschützten Modus geöffnet. Vergleichen Sie dies nun mit
$ 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
Auch hier ls
nahm sich und foo
als Argumente. Es gibt jedoch keinen open
Aufruf, das Argument wird nicht als Eingabe behandelt. Ruft stattdessen ls
die Systembibliothek auf stat
(die nicht mit dem stat
Befehl identisch ist ), um Informationen über die Datei abzurufen foo
.
Zusammenfassend kann gesagt werden, dass Sie, wenn der von Ihnen ausgeführte Befehl seine Eingabe liest, eine Pipe zu ihm ausführen können. Wenn dies nicht der Fall ist, können Sie dies nicht.
pgrep
,pkill
undkillall
Befehle.