Wiederholen Sie einen Terminalbefehl

Wiederholen Sie einen Terminalbefehl

Angenommen, ich habe einen Terminalbefehl namens foo(in Wirklichkeit würde dieser so etwas wie cdoder lsoder etwas komplizierteres lauten. Gibt es eine Möglichkeit, diesen Befehl mehrmals auszuführen, OHNE ein Skript zu verwenden.

Ich möchte beispielsweise das Äquivalent des Folgenden tun:

foo && foo && foo && foo && foo

Gibt es eine Möglichkeit, dass ich etwas in der Art von

foo * 5 

oder vielleicht

5:foo

Ich verwende eine Linux-Maschine.

Antwort1

Fügen Sie der Antwort des Bloggers ein Semikomma hinzu, um sie zu einem Einzeiler zu machen:

for variables in {1 2 3 4 5};  do ls; done

Antwort2

Blogger hat recht. Es ist jedoch wichtig, die Syntax genau zu beachten: Wenn Sie eine interaktive Shell verwenden (z. B. das Terminal),

echo -n; for i in {1..5}; do if [[ $? ]]; then foo; fi; done

das „$?“ gibt den Status des vorherigen Funktionsaufrufs zurück; da wir zuerst „echo“ aufrufen, wird die erste Iteration der Schleife „true“ sein (0 in Bash). Das „fi“ schließt die „if“-Anweisung ab und die Semikolons sind erforderlich.

Das Gleiche gilt, wenn Sie ein Bash-Skript schreiben:

#!/bin/bash
echo -n
für i in {1..5}; mache
wenn [[ $? ]]; dann
foo
fi
fertig

Ihnen wird auffallen, dass hinter „foo“ kein Semikolon steht. Beim Schreiben eines vollständigen Bash-Skripts in einer Umgebung, in der Zeilenumbrüche verfügbar sind (z. B. in Ihrem bevorzugten Texteditor), haben Zeilenumbrüche die gleiche Funktion wie Semikolons :)

Beachten Sie auch, dass Sie stattdessen verwenden könnten

[[ $? ]] && foo

anstelle der if-Anweisung; beachten Sie, dass && bedeutet, dass foo nur ausgeführt wird, wenn das vorherige foo keinen Fehler hatte. d. h. im Funktionsaufruf

thing1 && thing2

thing2 wird nur ausgeführt, wenn thing1 einwandfrei läuft (technisch gesehen, wenn es den Wert 0 zurückgibt). Um zu ignorieren, ob foo funktioniert oder nicht, verwenden Sie Semikolons anstelle von &&.

Antwort3

Sie können Folgendes versuchen:

for i in {1..10}; do YourCommand; done

Beispiel:

for i in {1..5}; do ls -l; done

Antwort4

Ich habe eine tolle Methode gefundenHier.

Ich weiß, dass es immer noch „eine Art Skript“ ist, aber ich denke, es kommt dem am nächsten, ohne eine ganze Befehlszeile einzugeben.

Sie können den Befehl erstellen, repeatmit dem Sie dies tun können:

 repeat 5 ./foo

Fügen Sie am Ende die folgenden Zeilen hinzu ~/.bashrc(wenn Sie Bash verwenden):

repeat() {
    n=$1
    shift
    while [ $(( n -= 1 )) -ge 0 ]
    do
        "$@"
    done
}

und bei der nächsten Anmeldung (oder beim Starten von Bash) können Sie verwenden repeat 5 ./foo.

Übrigens repeatist dies bereits ein Schlüsselwort (das genau dasselbe tut) in csh, tcsh und zsh. Mit dieser Ergänzung fügen Sie es also hinzu bashund es wird genau gleich funktionieren.

verwandte Informationen