Załóżmy, że mam następujący trywialny przykład history
:
...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...
Jeśli chciałbym wykonywać polecenia 77
, 78
i 79
w jednym poleceniu, czy istnieje do tego skrót? Próbowałem !77 !78 !79
, który po prostu umieści je wszystkie w jednym wierszu do wykonania.
!77 ; !78 ; !79
porządku?!77-79
Odpowiedzi:
EDYCJA: Możesz to zrobić w sposób zgodny z POSIX za pomocą narzędzia polecenia fix
fc
:Spowoduje to otwarcie edytora (prawdopodobnie
vi
) z poleceniami od 77 do 79 w buforze. Po zapisaniu i wyjściu (:x
) polecenia zostaną uruchomione.Jeśli nie chcesz ich edytować i JESTEŚ BARDZO PEWNY, wiesz, które polecenia wywołujesz, możesz użyć:
Używa się go
true
jako „edytora” do edycji poleceń, więc po prostu kończy pracę bez wprowadzania żadnych zmian, a polecenia są uruchamiane bez zmian.ORYGINALNA ODPOWIEDŹ:
Możesz użyć:
Zakłada się, że nie używasz żadnych aliasów, funkcji ani zmiennych, które są obecne tylko w bieżącym środowisku wykonawczym, ponieważ oczywiście nie będą one dostępne w uruchamianej nowej powłoce.
Lepszym rozwiązaniem (dzięki Michaelowi Hoffmanowi za przypomnienie mi w komentarzach) jest:
Jeden z bardzo niewielu przypadków, w których
eval
jest to właściwe!Zobacz także:
źródło
cd
, ale jest to przypadek skrajny.eval "$(history -p \!{77..79})"
powinno działać.Prosta odpowiedź: zamiast
!77 !78 !79
,!77; !78; !79
aby zrobić to, co próbujesz zrobić - wykonaj polecenie 77, a następnie polecenie 78, a następnie polecenie 79 bezwarunkowo lub!77 && !78 && !79
aby wykonać polecenie 77 i sprawdź, czy się udało. A następnie, jeśli polecenie 77 się powiedzie, wykonaj polecenie 78. A następnie, jeśli polecenie 78 się powiedzie, wykonaj polecenie 79.Nieco sprytniejsza odpowiedź (jeśli znajdujesz się w oknie typu terminal):
\!
do twojegoPS1
.82 history
, następne polecenie to 83.!-6
. Spowoduje to ponowne wykonanie polecenia 77.!-6
, skopiuj i wklej. Ponieważ ponowne wykonanie komendy 77 (./generator.sh
) było komendą 83, masz teraz komendę 84, więc!-6
ponownie uruchom komendę 78.!-6
potrzeby powtórz wklejanie .źródło