Kann ich pgrep mit kill verketten?

31

Ich habe bemerkt, dass |verwendet wird, um Ergebnisse des ersten Befehls an den anderen zu senden. Ich möchte alle Prozesse beenden, die einem Namen entsprechen.
Das macht pgrep normalerweise:

$ pgrep name
5089
5105

Und mehrere Argumente scheinen zu funktionieren kill:

sudo kill 5089 5105

Das ist aber falsch:

pgrep name | kill

Also, wie macht man das richtig?

Tomáš Zato - Setzen Sie Monica wieder ein
quelle
3
pkill. Und wenn das nicht gäbe, kill $(pgrep ...).
Mikel
Ich habe nicht nur nach diesen spezifischen Befehlen gefragt, sondern auch, um ein besseres Verständnis der Befehlskettung zu erhalten. Aber wie ich aus der Punktzahl der Fragen ersehen kann, sind Fragen, die verstanden werden sollen, unerwünscht ...
Tomáš Zato - Reinstate Monica
Wenn Sie die Frage allgemeiner formulieren möchten und sicherstellen möchten, dass es sich nicht um ein Duplikat handelt, kann ich darüber abstimmen.
Mikel
Entschuldigung, habe versehentlich meinen vorherigen Kommentar gelöscht. Ich bin auf einem Tablet und diese Seite hat wirklich kleine Buttons nebeneinander.
Mikel
Ich habe nur gesagt, dass ich abgelehnt habe, weil Ihre Frage nichts zu fragen schien, woraus Sie nicht gelernt haben könnten man pgrep. Der Downvote-Button zeigt an, dass für eine Frage keine Nachforschungen anstehen und ich in Ihrer Frage keine gefunden habe. Tut mir leid, wenn das hart schien.
Mikel

Antworten:

42

Versuche dies:

pgrep name | xargs kill

Wenn Sie verwenden pgrep name | kill, wird die Ausgabe von pgrep nameauf stdin von eingespeist kill. Da killstdin keine Argumente liest, funktioniert dies nicht.

Mit xargswird Argumente für killfrom stdin erzeugt. Beispiel:

$ pgrep bash | xargs echo
5514 22298 23079
cuonglm
quelle
5
Nichts mit Leerzeichen oder Zeilenumbruch zu tun. Einfach weil kill keine Argumente auf stdin liest.
Mikel
@Mikel: Mein Fehler, behoben.
Donnerstag,
17

Das sollte funktionieren:

pkill name

Ich schlage auch vor, die Manpage zu lesen.

Rouben Tchakhmakhtchian
quelle
5

Um eher auf das Allgemeine als auf das Besondere zu antworten ...

Pipes dienen dazu, die Ausgabe eines Programms als Eingabe an ein anderes Programm weiterzuleiten.

Es sieht so aus, als würden Sie versuchen, die Ausgabe eines Programms als Befehlszeilenargumente für ein anderes Programm zu verwenden.

Verwenden Sie dazu die Befehlssubstitution .

Zum Beispiel, wenn Sie ausführen möchten

sudo kill 5089 5105

Und Sie haben einen Befehl pgrep name, der ausgibt5089 5105

Sie setzen sie gerne zusammen

sudo kill $(pgrep name)
Mikel
quelle
Vielen Dank. Ich hoffe das wird auch anderen Anfängern helfen.
Tomáš Zato - Wiedereinsetzung von Monica am