Я бы хотел немного улучшить свой рабочий процесс с помощью 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чтобы удалить первое слово, но мне интересно , если есть более быстрый способ сделать это.
Ответы:
!$
расширяется до последнего слова вашей предыдущей команды.Так что вы могли бы сделать:
или:
Ваши примеры случайно повторяли только последнее слово, поэтому
!$
работали нормально. Если у вас действительно было много аргументов, которые вы хотели бы повторить, и вы просто хотели изменить первое слово, вы можете использовать его!*
, который распространяется на все слова предыдущей команды, кроме нуля.См. Раздел «РАСШИРЕНИЕ ИСТОРИИ» справочной
bash
страницы. Там много гибкости.источник
!$
вас нет полного визуального контроля над линией, которую вы запускаете . Это может иногда привести к вредным последствиям. Особенно, если вы попали в опечатку. Требуется от того,history
что расширить. Так что если вы напишите последнюю команду с пробелом в начале, вероятно, эта команда не завершится в истории. При выполнении вашей новой команды с!$
оболочкой параметры не будут приниматься из последней набранной командной строки, а только из последней истории. Здесь же больше слов.#
или,echo
чтобы я мог Посмотрите на это, и оно войдет в историю, так что я могу вернуть его обратно и запустить снова без отключения префикса.Ctrl+ aперейти в начало строки, затем Alt+, dчтобы удалить первое слово.
источник
Meta+D
действует только еслиemacs
он включен (set -o emacs
по умолчанию или просто). Он не будет работать в низкоуровневом редакторе илиemacs
отключен.C-a
иM-d
гораздо быстрее печатать, если ваши руки уже находятся в положении для печати.cat
и сравните то, что вы получите, нажав Home (^[[H
здесь) и нажав Ctrl + a (^A
).Я не уверен, будет ли это на самом деле быстрее или нет, но посмотрите эту статью, особенно пункт # .3:
источник
Alt+.
Если вам нужно только повторить последнюю часть одной из предыдущих команд, вы можете использовать Alt+ ., чтобы вставить последний аргумент, взятый из последней строки истории.
При нажатии более одного раза будет заменено то, что было вставлено с последним аргументом строки перед ...
Например, если последние 2 команды были:
В оболочке пишу
rm
и жму Alt+ .появится:если я нажму снова Alt+ .он появится вместо
и так далее...
источник
bash
. Кстати, вы уверены, что вы используете Bash в качестве оболочки ?≥
В дополнение к ответу @jjlin вас могут заинтересовать следующие советы:
$_
содержит последний аргумент предыдущей командной строкиПодробнее об этом смотрите в разделе «Имена команд Readline» на
bash
странице руководства .например:
источник
n
слова в команде, причемn = 1
в первом примере иn = 2
во втором. Ответ jjlin показывает, как удалить первое слово (и, повторно применив ярлык, удалить доn
слов). В вашем ответе перечислено несколько сочетаний клавиш Bash (которые действительно полезны), но ни один из них не является эффективным способом удаления первыхn
слов.$_
параметр, вероятно, сработает, если будет только один аргумент (т. Е.n = m - 1
Гдеm
общее количество аргументов). Остальная часть ярлыков не имеет отношения к вопросу, хотя.Если вы хорошо владеете vi, вы можете активировать привязки vi в bash (большинство оболочек?) С помощью команды
set -o vi
. Затем вы можете использовать обычные клавиши vi для редактирования вашей команды. В первом примере вы можете ^wcwудалить «diff», а затем изменить его на checkout.Возможно, не стоит изучать сочетания клавиш vi просто для редактирования командной строки, но если вы их уже знаете, это будет аккуратное повышение производительности.
источник
set -o vi
было, как я жил! Я даже делаю это в своих подсказках bash.bindkey -v
для зш.Esc
0
c
w
Есть много способов снять шкуру с этой кошки!
Чтобы заменить определенную строку,
^old^new^extra
будет принимать вашу предыдущую команду, заменитеold
сnew
, и присоединятьextra
. Вы можете остановиться как угодно; Например^old
, заменитold
пустую строку и добавит пустую строку (по сути, удаляяold
и больше ничего не делая).Особенно полезный вариант этого:
Чтобы заменить определенное слово, вы можете использовать
!m:n-p
для ссылки на словаn
черезp
командуm
(используйте отрицательные числа для обратного отсчета от текущей команды). Вы можете опустить-p
часть, чтобы ссылаться на одно слово, и опустить:m-p
часть, чтобы сослаться на всю команду. Специальные формы!!
для!-1
,!$
для последнего слова предыдущей команды, и!*
для аргументов (все , кроме слов0
) из предыдущей команды довольно удобно.Я часто использую оба из них; zsh особенно хорош здесь, поскольку нажатие на вкладку раскроет загадочные вещи, чтобы убедиться, что вы правильно поняли.
Есть также так много способов сделать это с редактированием строки. Читайте о сочетаниях клавиш вашей оболочки.
источник
Большинство терминальных программ поддерживают ...
<Up-Arrow>
мере необходимости, чтобы снова отобразить одну из предыдущих командных строк из истории.<Down-Arrow>
при необходимости, чтобы перейти к списку истории.<Left-Arrow>
мере необходимости, чтобы переместить курсор в конец второго слова.<Backspace>
при необходимости, чтобы стереть второе слово.<Right-Arrow>
/<Left-Arrow>
при необходимости, чтобы изменить положение для получения дополнительных изменений.<RETURN>
чтобы выполнить командуЕсли нужная вам командная строка была не последней, выполните поиск в обратном направлении,
<Ctrl-r>
как описано в вопросе ...Есть ли способ использовать ctrl-r после ввода части команды в bash?
Затем отредактируйте с помощью клавиш со стрелками по мере необходимости.
источник
Что я делаю (Ubuntu / Bash):
1)
Arrow up
эй, чтобы вернуть предыдущую команду.2)
Home
ключ, чтобы вернуться в начало.3) Изменить команду при необходимости.
Защита от дурака и особенно полезна для многострочных команд.
источник