Как эффективно перемещаться по командной строке bash?

19

Поэтому я использую upв своей оболочке (в основном, Bash на OSX или Ubuntu), но иногда я знаю, что мне нужно содержимое после текущего положения курсора. Есть ли какой-нибудь способ получить линию, на которой я нахожусь в комплекте с линией выше? Удар, upа потом leftраздражает.

Любые другие трюки тоже были бы классными, кроме тех tab, о которых мы все сейчас говорим :)

Вот пример (по запросу кряка):

Я печатаю, mkdir /where/the/hell/is/that/thingа затем я хочу перейти в тот же каталог. Но теперь я знаю о мета-б :)

Дэн Розенстарк
источник
1
явный пример был бы потрясающим.
Квик-кихот
@ ~ Пример шарлатанства сейчас
Дэн Розенстарк
1
вот связанный (дублированный) вопрос с довольно хорошим ответом: superuser.com/questions/124336/…
cregox

Ответы:

11

Попробуй это:

mkdir /where/the/hell/is/that/thing

затем нажмите alt+.

в зависимости от вашей операционной системы и терминала, возможно , придется ввести escзатем.

Вы также можете нажать alt+ 1+, .чтобы выбрать конкретный предыдущий аргумент.

Это намного лучше чем !! или! $, потому что вы можете увидеть, что вы собираетесь запустить, и в любом случае это займет меньше нажатий клавиш.

edit: строго говоря, это metaне altтак, поэтому он также может работать с клавишей «windows» в зависимости от того, как настроена ваша клавиатура.

user23307
источник
интересный! не знал об этом.
Квик-кихот
2
@ Просто так здорово. На OSX meta это побег.
Дэн Розенстарк
@ yar с OS X Terminal, есть также настройка предпочтений в «Настройки» -> «Клавиатура» для «Использовать опцию в качестве мета-ключа».
ThomasW
Спасибо @ThomasW Я должен вернуться к этому материалу. Я ежедневно в командной строке, но использую очень мало приемов.
Дэн Розенстарк
28

Вы должны прочитать man bash в вашей системе, особенно раздел Readline , так как это интерактивный механизм ввода bash. В руководстве по Bash на gnu.org есть хороший раздел о редактировании командной строки , который поможет заполнить некоторые пробелы.

По умолчанию вы можете использовать их для перемещения по командной строке (просто перечислите несколько здесь; см. Ссылку для полного списка):

  • Ctrl+ aперемещается в начало строки (или в Homeзависимости от настроек терминала)
  • Ctrl+ eперемещается в конец строки (или End...)
  • Meta+ fпродвигается вперед "слово"
  • Meta+ bсдвигается назад на «слово»

Вы можете использовать их, чтобы «убить» (иначе «вырезать») текст из строки:

  • Ctrl+ kубивает ("режет") текст с текущей позиции курсора до конца строки
  • Ctrl+ yyanks ("вставляет") последний убитый текст обратно в буфер при курсоре

Таким образом, вы можете объединить их, чтобы выбрать фрагмент какой-то командной строки, которую вы хотите повторить, убить ее, а затем вставить в конец следующей команды.


Теперь, чтобы сделать его еще более увлекательным, давайте рассмотрим расширение истории bash . Это то, !!что упоминает ответ Студера . Брейки расширения Истории вниз в десигнатор события , слова десигнаторов и модификаторы .

Обозначения событий выглядят следующим образом (снова см. Ссылки для полного списка):

  • ! - начинается подмена истории
  • !n- n-я команда в списке истории bash, для некоторого целого числа n (работает и для негативов)
  • !!- предыдущая команда; эквивалентно!-1
  • !string- самая последняя команда, начинающаяся со строки

Обозначения слов выбирают определенные части из события. Используйте :для отделения события от обозначения слова. Слова нумеруются от 0, начиная с начала строки, и вставляются в текущую строку, разделенные пробелами.

  • $- обозначает последний аргумент (например, !!:$является последним аргументом последней команды; может быть сокращен до !$)
  • n- обозначает n-е слово (например, !str:22-й аргумент самой последней команды, начинающейся с str ; !!:0это команда последней команды)

Итак, чтобы продолжить ваш пример, если ваша последняя команда mkdir /some/really/long/path, просто запуск !!снова запустит эту команду. Но вы хотите пойти по cdэтому пути:

$ cd !$

Теперь предположим, что вы выполняете некоторые другие команды, а затем хотите снова вернуться к этому пути. Если это была последняя команда mkdir, которую вы выполнили, вы можете использовать это, чтобы повторить этот путь:

$ tar czf ~/foo.tgz !mkdir:$
шарлатан
источник
вы также можете связать их (и другие команды Readline) с любыми комбинациями клавиш, которые вам нравятся; см. раздел 8.4 руководства «Связываемые команды чтения» : gnu.org/software/bash/manual/… и раздел 8.3 «Начальный файл чтения»
кря кихот
спасибо, что действительно помогает. Хотя «читать руководство» было отчасти ожидаемо, упоминание основных перемещений привязок помогает. Даже простое знание ctrl-a может быть реальной экономией.
Дэн Розенстарк
@ Quack, нет проблем, я поймал более позднюю ревизию, на самом деле :)
Дэн Розенстарк
1
также запишите bind -pили bind -Pраспечатаете ваши текущие сочетания клавиш; это окончательная ссылка на то, что использует ваш bash .
Квик-кихот
1
Я думаю, что этот ответ вырос: материал по расширению истории великолепен.
Дэн Розенстарк
6

Если вы пользователь vi, вы можете перевести оболочку в режим vi, набрав set -o vi.

После этого вы можете делать все что угодно в командной строке после ввода Esc + k.

Один я использую больше всего, Esc+Kто /любой текст , набранный после косая черта будет использоваться для поиска по истории командной строки.

Например Esc + k /smbclient , даст последнюю введенную вами команду smbclient. Вы можете прокручивать все поиски, используя стандартные клавиши vi ( jи kдля вверх и вниз, но я думаю, что стрелки вверх и вниз будут работать тоже).

Дополнительная помощь здесь , есть также некоторые встроенные вещи bash по этой ссылке, которые могут быть больше, чем вы ищете.

Ура, стю

Стюарт Брок
источник
В то время как режим vi бесполезен для меня, так как я еще не вышел на vi, чернила - это круто. Спасибо за это!
Дэн Розенстарк
1
Эквивалентом без режима vi является ctrl-r. Введите его, а затем часть предыдущей команды. Это приведет к последнему появлению того, что было напечатано. Нажмите Ctrl-R еще раз, чтобы перейти к следующему. Очень удобно.
Nerdfest
3

Вы можете использовать, !!который представляет последнюю команду:

% тестовое задание
% эхо !!
> тест
Studer
источник
интересный. Не уверен, что я хочу манипулировать этой строкой, используя ... что?
Дэн Розенстарк
это часть возможностей истории bash: gnu.org/software/bash/manual/… .. в частности расширение истории: gnu.org/software/bash/manual/bashref.html#History-Interaction ... примечание !!является синонимом для !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
квик-кихот
2
Это действительно полезно, когда вы забыли использовать sudo: т.е. sudo !! - $ more / etc / sudoers / etc / sudoers: В доступе отказано $ sudo !! sudo more / etc / sudoers [sudo] пароль для ..: # / etc / sudoers ... ... ...
user9632
@wookiebreath, спасибо за это, я сейчас проголосую за этот ответ
Дэн Розенстарк
0

В приведенном вами примере используйте! $ Для представления последнего параметра предыдущей команды:

mkdir / что-то / что-то другое

CD! $

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

Nerdfest
источник
0

Недавно я нашел этот шпаргалку очень полезной. Много чего я не знал. Я использовал !$все время, пока не узнал о Alt+ ., который я сейчас использую все время. :)

fredden
источник