44

Я хотел бы немного улучшить свой рабочий процесс с помощью Bash, и я понимаю, что часто хочу выполнить одну и ту же команду для другого исполняемого файла.

Некоторые примеры:

Git (где я хотел бы быстро изменить второе слово):

git diff     foo/bar.c
git checkout foo/bar.c

Cat/rm (где нужно изменить только первое слово):

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

Я знаю, что могу нажать Ctrl+a, а затем Del, чтобы удалить первое слово, но мне интересно, есть ли более быстрый способ сделать это.

9 ответов9

56

!$ расширяется до последнего слова вашей предыдущей команды.

Так что вы могли бы сделать:

cat foo/is/a/very/long/path/to/bar.c

rm !$

или же:

git diff foo/bar.c

git checkout !$

Ваши примеры случайно повторяют только последнее слово, так что !$ работал нормально. Если у вас действительно было много аргументов, которые вы хотели бы повторить, и вы просто хотели изменить первое слово, вы можете использовать !* , который распространяется на все слова предыдущей команды, кроме нуля.

См. Раздел "РАСШИРЕНИЕ ИСТОРИИ" справочной страницы bash . Там много гибкости.

28

Ctrl+a, чтобы перейти к началу строки, затем Alt+d, чтобы удалить первое слово.

17

Я не уверен, будет ли это на самом деле быстрее или нет, но посмотрите эту статью, особенно пункт # .3:

  1. Замените строку из предыдущей команды, используя ^ str1 ^ str2 ^

В следующем примере сначала мы выполнили команду ls, чтобы проверить файл. Позже мы поняли, что хотим просмотреть содержимое файла. Вместо того, чтобы снова вводить полное имя файла, мы можем просто заменить «ls» в предыдущей команде на «cat», как показано ниже.

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate
15

Alt+.

Если вам нужно только повторить последнюю часть одной из предыдущих команд, вы можете использовать Alt+. это вставит последний аргумент, взятый из последней строки истории.

При нажатии более одного раза будет заменено то, что было вставлено с последним аргументом строки перед ...

Например, если последние 2 команды были:

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

В оболочке я пишу rm и нажимаю Alt+. это появится:

rm foo/is/a/very/long/path/to/SomeWhereElse.c

если я снова нажму Alt+. это появится вместо

rm foo/is/a/very/long/path/to/bar.c

и так далее...

11

В дополнение к ответу @jjlin вас могут заинтересовать следующие советы:

  • Ctrl+w удаляет слово слева от вас
  • Ctrl+k удаляет курсор от конца командной строки
  • Ctrl+U удаляет курсор от начала командной строки
  • Alt+b перемещает курсор на одно слово назад
  • Alt+f перемещает курсор на одно слово вперед
  • $_ содержит последний аргумент предыдущей командной строки

Подробнее об этом смотрите в разделе "Имена команд Readline" на странице руководства bash .

например:

cat foo/is/a/very/long/path/to/bar.c
rm $_
7

Если вы разбираетесь в vi, вы можете активировать привязки vi в bash (большинство оболочек?) с помощью команды set -o vi . Затем вы можете использовать обычные клавиши vi для редактирования вашей команды. В первом примере вы можете выполнить ^ w c w, чтобы удалить "diff", а затем изменить его на checkout.

Возможно, не стоит изучать сочетания клавиш vi просто для редактирования командной строки, но если вы уже знаете их, это будет аккуратное повышение производительности.

5

Есть много способов снять шкуру с этой кошки!

Чтобы заменить определенную строку, ^old^new^extra примет вашу предыдущую команду, заменит old на new и добавит extra . Вы можете остановиться как угодно раньше; Например, ^old заменит old пустой строкой и добавит пустую строку (по сути, удаляя old и больше ничего не делая).

1. ^diff^checkout
2. ^cat^rm

Особенно полезный вариант этого:

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

Чтобы заменить конкретное слово, вы можете использовать !m:n-p для ссылки на слова n p команды m (используйте отрицательные числа для обратного отсчета от текущей команды). Вы можете опустить часть -p для ссылки на одно слово и опустить часть :m-p для ссылки на всю команду. Специальные формы !! за !-1 !$ за последнее слово предыдущей команды и !* аргументы (все, кроме слова 0) предыдущей команды довольно удобны.

1. !!:0 checkout !!:2-
2. rm !*

Я часто использую оба из них; zsh особенно хорош здесь, так как нажатие на вкладку раскроет загадочные вещи, чтобы убедиться, что вы правильно поняли.

Есть также так много способов сделать это с редактированием строки. Читайте о сочетаниях клавиш вашей оболочки.

-2

Большинство терминальных программ поддерживают ...

  • Нажмите <Up-Arrow> мере необходимости, чтобы снова отобразить одну из предыдущих командных строк из истории.
    • Нажмите <Down-Arrow> мере необходимости, чтобы двигаться вперед по списку истории.
  • Нажмите <Left-Arrow> мере необходимости, чтобы переместить курсор в конец второго слова.
  • Нажмите <Backspace> чтобы стереть второе слово.
  • Введите замену второго слова.
    • Нажмите <Right-Arrow> / <Left-Arrow> мере необходимости, чтобы изменить положение для дополнительных изменений.
  • Нажмите <RETURN> чтобы выполнить команду

Если нужная вам командная строка была не последней, выполните поиск в обратном направлении с помощью <Ctrl-r> как описано в вопросе ...
Есть ли способ использования ctrl-r после ввода части команды в bash?
Затем отредактируйте с помощью клавиш со стрелками по мере необходимости.

-3

Что я делаю (Ubuntu/ Bash):

1) Arrow up эй, чтобы вернуть предыдущую команду
2) Home ключ, чтобы вернуться в начало
3) Изменить команду по мере необходимости.

Защита от идиота и особенно полезна для многострочных команд.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .