2

Чтобы использовать команду из истории, вы можете написать как $!100 Но иногда я немного меняю команду.

Есть ли способ получить команду из истории без ее выполнения.

Теперь я копирую и вставляю из истории, используя мышь. Я хочу знать, как это сделать, используя только клавиатуру.

6 ответов6

3

В Bash начните вводить первые несколько букв команды, а затем нажмите Ctrl+R, чтобы начать поиск в истории. Вы можете нажать Ctrl+R, чтобы продолжить поиск в истории Bash. Когда вы найдете нужную вам команду, используйте клавиши со стрелками для выбора / навигации по команде для ее редактирования и выполнения в соответствии с вашими потребностями.

Вы также можете нажать Ctrl+R с пустым буфером команд и начать поиск оттуда.

2

В дополнение к уже найденному поиску истории с помощью Ctrl + R, вы можете использовать метод нумерации записей истории, с которым вы уже знакомы:

!<history entry number>

в середине других команд, таких как

echo !100

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

ping google.com

Я мог бы выполнить поиск хоста в Google, вытащив первый аргумент из этой записи истории следующим образом:

host !100:1

Это работает для специальной ссылки на предыдущую команду

!!

также. Конечно, для пронумерованных записей вы должны знать их номер, либо набирая историю и просматривая, либо отправляя сообщения grep. Если вы хотите извлечь из своей истории соответствие текста, вы можете использовать текст из предыдущей команды в! заявление. Например, используя тот факт, что в моей истории есть такой запрос ping google.com, я могу сослаться на него следующим образом:

host !ping:1

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

1

Бежать

shopt -s histverify

Используя это, вы получите расширение команды history и сможете редактировать ее перед выполнением. Из руководства:

Если включен параметр оболочки histverify и используется Readline, подстановки истории не сразу передаются анализатору оболочки. Вместо этого расширенная строка перезагружается в буфер редактирования Readline для дальнейшей модификации.

Вы можете поместить эту опцию в конфигурационные файлы Bash (например, ~/.bash_profile или ~/.bashrc зависимости от того, что вы используете), чтобы включить ее автоматически.

1

Вы можете заменить любую строку в предыдущей команде оператором ^^ . Не уверен, как это называется. В противном случае (не последняя команда) используйте предложение Гарретта.

$ ping 10.3.0.3
PING 10.3.0.3 (10.3.0.3) 56(84) bytes of data.
64 bytes from 10.3.0.3: icmp_req=1 ttl=64 time=0.333 ms
64 bytes from 10.3.0.3: icmp_req=2 ttl=64 time=0.251 ms
^C
--- 10.3.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.251/0.292/0.333/0.041 ms

магия здесь:

$ ^ping^finger
finger 10.3.0.3
The program 'finger' is currently not installed.  You can install it by typing:
apt-get install finger
0

Есть ли способ получить команду из истории, не выполняя ее?

Может быть, я упускаю суть вопроса, так как сомневаюсь, что я единственный человек, который знает о :p .  Это означает «печать».  Если вы печатаете !100:p , оболочка напечатает (то есть отобразит) команду # 100 без ее выполнения.

Если вы не знаете об операторах : в истории, вы должны изучить.  Как указывает «числовая иллюстрация» :n извлекает n- е слово команды.  Вы также можете использовать :n-m чтобы получить диапазон; и есть интересные значения по умолчанию.  Например,::- (оставив пустыми n и m ), вы получите все слова, кроме последнего. :$ получает последнее слово. :h это «голова», так что если вы печатаете

ls -ld /asdfg/qwerty/foo/bar

затем

!:- !$:h

превращается в

ls –ld /asdfg/qwerty/foo

Ах да !$ - это сокращение от !:$ . :s является заменой, как в :s/old/new/ .  Это так же, как ^old^new^ за исключением таких вещей, как

  1. :s может использоваться для любой команды (как в !100:s/...); ^^ работает только с самой последней командой.
  2. :s может использоваться для отдельных слов или диапазонов слов.  Например,

    !:- !$:s/d/D/

    получает

    ls -ld /asDfg/qwerty/foo/bar

    (а не ls -lD ...).

  3. :s может применяться глобально.  Синтаксис не интуитивен, но, где :s/old/new/ заменяет первое вхождение, :gs/old/new/ заменяет каждое вхождение.

Кроме того, как только вы получили команду из истории, не выполнив ее (например, с помощью !100:p), возможно, с изменениями (как показано выше), это станет самой последней командой в вашем списке истории.  Теперь вы можете нажать cursor (курсор вверх) и отредактировать его.

0

Ты можешь использовать:

cat ~/.bash_history

... чтобы просмотреть записи в вашей истории bash. Если вы ищете что-то конкретное, направьте его в grep и выполните поиск. Например, если я запустил команду chmod, к которой я хочу вернуться, я мог бы выполнить:

cat ~/.bash_history | grep chmod

... чтобы найти эти записи. Надеюсь, я правильно понимаю ваш вопрос.

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