Просмотр реальных команд, введенных в истории Bash

220
borrible

Можно ли получить фактические команды, введенные в истории Bash? Если команда включала (например) подстановку или модификатор истории, то в истории отображается скорее команда, чем напечатанная команда.

Пара примеров. Предположим, что в обоих случаях команда 123 в историиls Red*

  1. Если я введу в !123командной строке 123 из истории, а теперь посмотрим на последнюю команду в своей истории, я увижу, ls Red*а не !123.

  2. Если использовать встроенную команду оболочки fc -s Red=Blue 123и посмотреть историю, я буду видеть, ls Blue*а неfc -s Red=Blue 123

Точно так же, если я использую стрелку вверх (создавая escape-последовательность ^[[A), я получаю расширенную команду, а не фактический набранный текст.

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

Я понимаю, что это будет еще сложнее после инициализации оболочки, так как HISTFILEне содержит эту информацию. Я не заинтересован в получении оригинального текста в этом случае (хотя это интересно).

0
Это не фактический ответ на ваш вопрос, но - если вы находитесь в терминале, который позволяет копировать и вставлять (и вы * все еще * вошли в систему; т. Е. Не пытаетесь восстановить нажатия клавиш, которые вы набрали на прошлой неделе), это часто полезно копировать и вставлять старые команды. Например, если я хочу многократно чередовать две команды, я мог бы набрать `ls Red *`, `ls Blue *` и `! -2` - а затем скопировать`! -2` и вставить его несколько раз. Вы также можете посмотреть на программу под названием «экран». Scott 7 лет назад 0

1 ответ на вопрос

1
MAP

Фактический ответ на заданный вами вопрос: «Нет, bash не имеет такой функции». Это было то, о чем я думал около десяти лет назад, когда я работал в том же здании, что и основная команда GNU, и поэтому я пошел и поговорил с ними и, по-видимому, добавил, что это будет PITA (включая выяснение синтаксиса и сохранение всех что лишняя история). Многие люди иногда извлекали бы выгоду, но было много больших проблем для решения, так что вряд ли это было решено.

С другой стороны, я часто обнаруживал, что использование функций вырезания и вставки X11 может удовлетворить мои реальные потребности практически в каждом случае. Это стало еще лучше с открытием следующего кусочка XResourceмагии:

*cutToBeginningOfLine: False 

Если вы знаете, где XResourceнаходятся ваши файлы, вы можете добавить эту строку в этот файл. Если вы не можете определить это, вы можете просто добавить echo '*cutToBeginningOfLine: False'|xrdb -mergeодин из ваших файлов запуска (например .profile, но зависит от вашей оболочки).

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

Интересная история, спасибо. Вы случайно не знаете, существует ли эта функция в других распространенных оболочках? borrible 7 лет назад 0
Нет, я строго человек Баш. Зная лично первых разработчиков bash, возможно, это как-то связано. MAP 7 лет назад 0