Gibt es eine Möglichkeit, einen Befehl (z. B. ps aux|grep someprocess
) n- mal auszuführen ?
So etwas wie:
run -n 10 'ps aux|grep someprocess'
Ich möchte es interaktiv nutzen, bitte keine Skripte posten.
Update: Der Grund dafür ist, dass ich auf vielen Rechnern arbeite und nicht alle meine angepassten Skripte usw. in jede Box importieren möchte, um auf allen Rechnern die gleiche Funktionalität zu erhalten.
Antworten:
Ich glaube nicht, dass es dafür einen Befehl oder eine Shell gibt, da dies eine triviale Teilmenge dessen ist, wofür die Bourne-Shell-
for
Schleife entwickelt wurde, und die Implementierung eines solchen Befehls selbst daher recht einfach ist.Für den Anfang können Sie eine Dummy-
for
Schleife verwenden:Oder entsprechend dem Vorschlag von JimB, den eingebauten Bash-Code zum Generieren von Sequenzen zu verwenden:
Dies wird
command
jedes Mal zehnmal wiederholt - es kann sich um eine Pipe oder eine Reihe von Befehlen handeln, die durch;
oder getrennt sind&&
. Sie können die$i
Variable verwenden, um zu ermitteln, in welcher Iteration Sie sich befinden.Wenn Sie diesen Einzeiler für ein Skript halten und dies aus einem nicht näher definierten (aber möglicherweise gültigen) Grund unerwünscht ist, können Sie ihn als Befehl implementieren, möglicherweise in etwa so auf Ihrer .bashrc-Datei (ungetestet):
Verwendungszweck:
Beispiel:
quelle
for
ist die eingebaute Bash zum Iterieren.seq
:{1..10}
.bashrc
if gestellt{1..$number}
ist, wird jedoch gegen if ausgetauscht`seq $number`
.ps aux | grep someprocess
Sieht so aus, als ob Sie Änderungen eines Programms für eine bestimmte Zeit sehen möchten. Eduardo gab eine Antwort, die Ihre Frage genau beantwortete, aber es gibt eine Alternativewatch
:Beachten Sie, dass ich den Befehl in einfache Anführungszeichen gesetzt habe, um zu vermeiden, dass die Shell den Befehl als "run watch ps aux" interpretiert und das Ergebnis weiterleitet
grep someprocess
. Eine andere Möglichkeit, den vorherigen Befehl auszuführen, wäre:Standardmäßig werden
watch
alle zwei Sekunden Aktualisierungen durchgeführt, die mit der-n
Option geändert werden können . Zum Beispiel, wenn Sie ein Intervall von 1 Sekunde haben wollen:quelle
Nur zum Spaß
quelle
for
scheint der beste Weg. Trotzdem danke für die Antwort.cmd ;!!
in einer Zeile nicht einfach der vor der aktuellen Zeile eingegebene Befehl wiederholt ? Es müssten zwei separatehistory
Einträge sein.;
mit&&
, um beim ersten Ausfall anzuhalten.Ähnlich wie bei vorherigen Antworten, erfordert jedoch keine for-Schleife:
Pipe-Ausgabe von seq an xargs ohne Argumente oder Optionen
quelle
echo "hello" 1 2 3 4 5 6 7 8 9 10
. Sie müssen xargs mit-n 1
für einen Prozess für jede Eingabe (Nummer) und mit-P 10
für die parallele Ausführung (10 parallele Prozesse) ausführen. Am Ende mitseq 10 | xargs -n 1 -P 10 echo
.Versuche dies:
Dies setzt voraus, dass der Befehl in einer Sub-Shell ausgeführt wird, was eine leichte Leistungsbeeinträchtigung darstellt. YMMV. Grundsätzlich erhalten Sie den Befehl "yes", um die Zeichenfolge "ls" N-mal zu wiederholen. während "head -n5" die Schleife bei 5 Wiederholungen beendete. Die letzte Pipe sendet den Befehl an die Shell Ihrer Wahl.
Übrigens haben
csh
ähnliche Shells einen eingebautenrepeat
Befehl. Sie könnten das benutzen, um Ihren Befehl in einer bash-Sub-Shell auszuführen!quelle
POSIX Weg
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
Das könnte natürlich zu einem Einzeiler gemacht werden:
und scheint der portabelste Weg zu sein, und daher ist es weniger wahrscheinlich, dass Sie Programme installieren.
Die folgenden sind weniger portabel:
{1..10}
: bash-spezifisch und würde eine große Zeile erzeugen, wenn das Argument groß istseq
: GNUyes
: GNUUnd wenn Sie die Portabilität satt haben, ziehen Sie GNU in Betracht
parallel
:Das führt Befehle parallel aus und hat viele coole Optionen.
Siehe auch: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash
quelle
sh, zsh, ksh
undbash
werden auf den meisten Plattformen gut unterstützt.csh, tcsh, fish
hat etwas Unterstützung. Mithilfe von könnenparallel --embed
Sie sogar ein Skript erstellen, das leicht auf ein anderes System verschoben werden kann, auf dem GNU Parallel nicht installiert ist.Eine Fischschalenimplementierung von @ eduardo-ivanecs
run
Funktion obenquelle
Das wäre 'watch' - sollte Teil fast jedes Unix-Systems sein, das procps verwendet
Sie können Änderungen oder andere interessante Bewegungen in einem System sehen. Zum Beispiel,
Setzen Sie einfach Ihre Befehle als Argument (siehe
man watch
)quelle
Unter macOS können Sie den
repeat
Befehl verwenden.quelle