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, awketc.), 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 mvkeine 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 sedInput 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 fileist das Argument, das gegeben wurde cat. Um genau zu sein, der Dateiname file ist das Argument. Da es sich jedoch catum ein Programm handelt, das den Inhalt von Dateien manipuliert, erfolgt die Eingabe nach dem Inhalt file.
Dies kann mit straceeinem Programm veranschaulicht werden , das die von Prozessen ausgeführten Systemaufrufe nachverfolgt. Wenn wir cat foovia ausführen strace, können wir sehen, dass die Datei foogeö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/cataufgerufen wurde und seine Argumente catund waren foo(das erste Argument ist immer das Programm selbst). Später wurde das Argument fooim 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 lsnahm sich und fooals Argumente. Es gibt jedoch keinen openAufruf, das Argument wird nicht als Eingabe behandelt. Ruft stattdessen lsdie Systembibliothek auf stat(die nicht mit dem statBefehl 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,pkillundkillallBefehle.