Предположим, у меня есть следующий тривиальный пример в моем history
:
...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...
Если я хотел выполнить команды 77
, 78
и 79
в одной команде, существует ли ярлык для этого? Я пытался !77 !78 !79
, который просто поместит их все в одну строку для выполнения.
!77 ; !78 ; !79
порядке?!77-79
)Ответы:
РЕДАКТИРОВАТЬ: Вы можете сделать это POSIX-совместимым способом с помощью инструмента исправления
fc
:Это откроет ваш редактор (вероятно
vi
) с командами с 77 по 79 в буфере. При сохранении и выходе (:x
) команды будут запущены.Если вы не хотите их редактировать и вы ОЧЕНЬ уверены, что знаете, какие команды вы вызываете, вы можете использовать:
Он используется
true
в качестве «редактора» для редактирования команд, поэтому он просто завершает работу без внесения каких-либо изменений, и команды запускаются как есть.ОРИГИНАЛЬНЫЙ ОТВЕТ:
Вы можете использовать:
Это предполагает, что вы не используете псевдонимы или функции или какие-либо переменные, которые присутствуют только в текущей среде выполнения, поскольку, конечно, они не будут доступны в новой запускаемой оболочке.
Лучшее решение (спасибо Майклу Хоффману за напоминание в комментариях):
Один из очень, очень немногих случаев, когда
eval
это действительно уместно!Также см:
источник
cd
, но это крайний случай.eval "$(history -p \!{77..79})"
должно сработать.Простой ответ: вместо того , чтобы
!77 !78 !79
,!77; !78; !79
чтобы сделать то, что вы пытаетесь сделать - выполните команду 77, затем команду 78, а затем команду 79, безусловно, или!77 && !78 && !79
команду 77 и проверьте, успешно ли она выполнена. И затем, если команда 77 выполнена успешно, выполните команду 78. И затем, если команда 78 прошла успешно, выполните команду 79.Немного умнее ответ (если вы находитесь в окне типа терминала):
\!
в вашемPS1
.82 history
, то ваша следующая команда - 83.!-6
. Это повторно выполнит команду 77.!-6
, скопируйте и вставьте его. Поскольку ваше повторное выполнение команды 77 (./generator.sh
) было командой 83, теперь вы выполняете команду 84, поэтому!-6
повторите команду 78.!-6
по желанию.источник