Uruchom ponownie to samo polecenie z innym parametrem


13

Wiem, że mogę uruchomić następujące polecenie

ls Some{File,Folder}

Jest to równoważne z uruchomieniem tego:

ls SomeFile SomeFolder

(Często używam tego do takich rzeczy mv place_{a,b})

Zastanawiałem się jednak, czy istnieje inny skrót, w którym mógłbym zrobić coś takiego:

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

I musiałem tylko pisać run-command --a --whole --lot --of --flags parameter {a,b}lub coś podobnego.


Zależy to od tego run-command, że wiele poleceń uniksowych obsługuje kilka argumentów plików w sekwencji.
vonbrand

Odpowiedzi:


13

Zakładając, że używasz GNU bashlub czegoś podobnego:

Być może forpętla?

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

który można również zapisać w jednym wierszu jako for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done


1
lub jeśli masz dużo, co chcesz uruchomić, możesz użyć rozszerzenia bash w ten sposóbfor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller

To, co tam się dzieje, może być listą oddzieloną spacjami, generowaną na wiele sposobów. Więc tak, {a..z}, *.pdf, $(find ...)...
njsg

Nie wiem, dlaczego mój umysł nie przeskakiwał. Dzięki! Prawdopodobnie będzie to to, czego używam. Pomysł funkcji jest dobry, ale podoba mi się to bardziej.
popołudnia

1
One-liner działał tylko dla mnie po usunięciu ;następującego dosłowa kluczowego.
jimp

@jimp Dzięki, zmieniłem kod, aby to usunąć ;.
njsg

5

Jeśli nie piszesz tego w skrypcie i chcesz po prostu uruchomić go z łatwością w wierszu poleceń, xargspolecenie prawdopodobnie jest tym, czego szukasz.

xargs weźmie zawartość ze standardowego wejścia i użyje jej jako argumentów dla polecenia, uruchamiając to polecenie wiele razy w razie potrzeby.

Spróbuj wykonać następujące czynności:

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

W tym przykładzie po prostu podajesz xargs permutacje, które chcesz uruchomić.

Flaga „-n 1” mówi xargsowi, aby używał tylko 1 argumentów na uruchomienie.

Flaga „-d” informuje xargs, aby szukał „” na wejściu jako separatora między argumentami do uruchomienia. (Zauważ, że jeśli argument zawiera „,”, musisz zmienić to na coś innego. Jeśli twoje argumenty nie zawierają spacji, możesz całkowicie pominąć tę flagę.)

Zobacz man xargswięcej informacji.


4

Możesz także użyć funkcji, która nie ogranicza cię do zmiany argumentu na końcu:

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

runcom a
runcom b

2

Możesz wykonać zamiany w poprzednim poleceniu. To nie zadziała z twoim przykładem {a, b}, ponieważ wszystkie wystąpienia „a” zostaną zastąpione przez „b". Ale wyobraź sobie, że chcesz wykonać następujące polecenia:

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

Możesz to zrobić za pomocą

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

Bash dokona podstawienia i uruchomi się

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

Użyj gs (podstawienie globalne), aby wykonać kilka podstawień, nie tylko jedno.


1

W aliasbash znajduje się polecenie:

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

Wykorzystanie jest: $ shotcommand a


Istnieją również funkcje, jeśli kod jest nieco bardziej złożony :-)
njsg

2
To rozwiązanie działa tylko wtedy, gdy mój zmieniający się parametr jest ostatnim, prawda?
piątek

Tak. Masz rację.
dchirikov
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.