Załóżmy, że chcę wykonać sekwencję czterech poleceń, które wcześniej wykonałem. Jeśli pierwszy to 432 w historii poleceń, mógłbym zrobić:
$ !432; !433; !434; !435
Jestem ciekawy, czy istnieje bardziej skuteczny sposób na osiągnięcie tego?
Załóżmy, że chcę wykonać sekwencję czterech poleceń, które wcześniej wykonałem. Jeśli pierwszy to 432 w historii poleceń, mógłbym zrobić:
$ !432; !433; !434; !435
Jestem ciekawy, czy istnieje bardziej skuteczny sposób na osiągnięcie tego?
Odpowiedzi:
Jeśli odnosi się do ostatnio uruchomionych poleceń, bardziej efektywnym sposobem jest odniesienie ich do liczb ujemnych:
!-4; !-3; !-2; !-1
Ponadto, gdy to zrobisz, twój ostatni wpis historii będzie zawierał cały łańcuch poleceń, więc możesz to powtórzyć !!
.
Edycja:
Jeśli jeszcze tego nie zrobiłeś, zapoznaj się ze wspaniałą wbudowaną funkcją fc
, o której wspomniał Gilles . (Użyj help fc
.) Okazuje się, że możesz również używać liczb ujemnych, więc możesz zrobić to samo, co powyżej, używając
eval "`fc -ln -4 -1`"
Ma to jednak jedno zastrzeżenie: po tym eval
wiersz jest zapisywany w historii jako ostatnie polecenie. Więc jeśli uruchomisz to ponownie, wpadniesz w pętlę!
Bezpieczniejszym sposobem na to jest użycie domyślnego fc
trybu działania: przekazanie wybranego zakresu poleceń do edytora i uruchomienie ich po wyjściu z niego. Próbować:
fc -4 -1
Możesz nawet odwrócić kolejność zakresu poleceń: fc -1 -4
Aby wyświetlić zakres poleceń w historii, użyj wbudowanego fc
polecenia:
fc -ln 432 435
Aby wykonać je ponownie:
eval "$(fc -ln 432 435)"
man fc
nic mi nie daje. Co oznacza fc
skrót Jakie są inne opcje?
help fc
... a także help help
.... help: help [-dms] [pattern ...] Wyświetla informacje o wbudowanych poleceniach.
-l
flagi wykona się bez potrzeby zła eval
.
fc
oznacza „znajdź polecenie” lub „napraw polecenie”.
Istnieje przyjemny i alternatywny sposób uruchamiania wielu poleceń w sekwencji z historii Bash:
zamiast używać zastępowania historii ( !432
lub !-4
), możesz przeszukiwać historię za pomocą Ctrl+ r, a gdy znajdziesz pierwsze polecenie, które chcesz uruchom, naciśnij Ctrl+ o( operuj i idź dalej ) zamiast returnklawisza
Spowoduje to uruchomienie polecenia i zaproponowanie następnego z historii. Możesz trafić Ctrl+otyle razy, ile chcesz i zakończyć sekwencję albo returnna ostatnią, albo Ctrl+czatrzymać się bez uruchamiania.
Ctrl-o
prostu wysyła literał ^o
i łamie mój (reverse-i-search)
. Może wiąże się to z innymi ustawieniami.
Aby natychmiast wykonać polecenia zamiast je edytować, oto syntaktycznie cieńsza wersja odpowiedzi Gilesa z użyciem eval :
fc -e: 432 435
Argument dwukropka -e to bash noop, który powoduje pominięcie kroku „otwórz w edytorze”, którego chce fc. Ponadto, teraz (najnowsza) historia będzie zawierać rzeczywiste polecenia z historii, a nie instrukcję eval.
fc
dla pętli i xsel
Działa to dobrze, gdy chcę połączyć i ponownie uruchomić ostatnie n poleceń wiele razy:
fcn() (
from="${1:-2}"
to="${2:-1}"
if [ "$from" -ne "$to" ]; then
for i in `seq "$from" -1 "$(($to + 1))"`; do
printf "$(fc -ln -${i} -${i}) && "
done
fi
printf "$(fc -ln -${to} -${to})"
)
Następnie:
$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$ echo a && echo b && echo c
a
b
c
$ # Paste again if you feel like it.
$ echo a && echo b && echo c
a
b
c
Lub w przypadku większych poleceń, które mogą wymagać edycji:
fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh
history -p \!43{2..5}
aby wydrukować polecenia od 432 do 435 na terminalu, odpowiednie do późniejszego kopiowania / wklejania.