Führen Sie denselben Befehl mit einem anderen Parameter erneut aus


13

Ich weiß, dass ich den folgenden Befehl ausführen kann

ls Some{File,Folder}

Und das ist gleichbedeutend mit:

ls SomeFile SomeFolder

(Ich benutze es auch oft für Dinge wie mv place_{a,b})

Ich habe mich jedoch gefragt, ob es eine andere Verknüpfung gibt, mit der ich so etwas tun kann:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b

Und ich musste nur tippen run-command --a --whole --lot --of --flags parameter {a,b}oder ähnliches.


Das hängt davon ab run-command, dass viele Unix-Befehle mehrere Dateiargumente nacheinander verarbeiten.
Vonbrand

Antworten:


13

Angenommen, Sie verwenden GNU bashoder ähnliches:

Vielleicht eine forSchleife?

for x in a b
do
    run-command --a --whole --lot --of --flags parameter $x
done

was auch in einer Zeile geschrieben werden kann als for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done


1
oder wenn Sie eine Menge haben, die Sie ausführen möchten, können Sie die Bash-Erweiterung wie for x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
folgt verwenden

Was dahin geht, kann eine durch Leerzeichen getrennte Liste sein, die auf viele Arten erzeugt wird. Also ja, {a..z}, *.pdf, $(find ...)...
njsg

Ich weiß nicht, warum mein Verstand nicht zu Schleifen gesprungen ist. Vielen Dank! Dies wird wahrscheinlich das sein, was ich benutze. Die Funktionsidee ist gut, aber das gefällt mir besser.
Heute,

1
Der Einzeiler hat nur bei mir funktioniert, nachdem das ;folgende doSchlüsselwort entfernt wurde.
23.

@jimp Danke, ich habe den Code geändert, um das zu entfernen ;.
njsg

5

Wenn Sie dieses Skript nicht schreiben und es einfach über eine Befehlszeile ausführen möchten, ist der xargsBefehl wahrscheinlich genau das, wonach Sie suchen.

xargs verwendet eine Reihe von Inhalten aus der Standardeingabe und verwendet sie als Argumente für einen Befehl, wobei dieser Befehl bei Bedarf mehrmals ausgeführt wird.

Versuche Folgendes:

echo parameter a,parameter b | xargs -n 1 -d , run-command --a --whole --lot --of --flags

In diesem Beispiel geben Sie xargs einfach die Permutationen, die ausgeführt werden sollen.

Das Flag "-n 1" weist xargs an, nur 1 der Argumente pro Lauf zu verwenden.

Das Flag "-d" weist xargs an, nach einem "," in der Eingabe als Trennzeichen zwischen den auszuführenden Argumenten zu suchen. (Wenn das Argument ein "," enthält, müssen Sie dies in etwas anderes ändern. Wenn Ihre Argumente keine Leerzeichen enthalten, können Sie dieses Flag ganz weglassen.)

Siehe man xargsfür weitere Informationen.


4

Sie können auch eine Funktion verwenden, die Sie nicht darauf beschränkt, Ihr Argument am Ende zu ändern:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b

2

Sie können Ersetzungen im vorherigen Befehl ausführen. Dies funktioniert in Ihrem Beispiel {a, b} nicht, da alle Instanzen von "a" durch ein "b" ersetzt werden. Stellen Sie sich jedoch vor, Sie möchten die folgenden Befehle ausführen:

run-command --a --whole --lot --of --parameter --format xml
run-command --a --whole --lot --of --parameter --format son

Sie können es mit tun

run-command --a --whole --lot --of --parameter --format xml
!!:s/xml/json/

Bash wird die Auswechslung vornehmen und ausführen

run-command --a --whole --lot --of --parameter --format json

Verwenden Sie gs (globale Ersetzung), um mehrere Ersetzungen durchzuführen, nicht nur eine.


1

aliasIn bash gibt es einen Befehl:

$ alias shotcommand='run-command --a --whole --lot --of --flags parameter'

Die Verwendung ist: $ shotcommand a


Es gibt auch Funktionen, wenn der Code etwas komplexer ist :-)
njsg

2
Diese Lösung funktioniert nur, wenn mein sich ändernder Parameter der letzte ist, richtig?
Am

Ja. Du hast recht.
Dchirikov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.