Ctrl-x Ctrl-e bash как редактировать предыдущую многострочную команду

Вопрос или проблема

В bash хочу повторно отредактировать многострочную команду (которую я вызывал ранее) с помощью Ctrl-x Ctrl-e. Это откроет vim (для меня) и позволит ввести команду. Теперь с установленными всеми возможностями (ссылка):

shopt -s cmdhist
shopt -s lithist
HISTTIMEFORMAT='%F %T '

это все равно не работает. Например, когда я нажимаю Ctrl-x Ctrl-e, чтобы открыть буфер команд в vim и вводить:

echo "Hello"
echo "World"

в редакторе команд, сохранить / выполнить, это воспримет каждую строку как отдельный элемент истории! Это становится очевидным, когда я пытаюсь прокрутить историю с помощью Ctrl-p. Тем не менее, я хочу, чтобы они объединялись в одну запись в истории и также сохранялись на диске. Когда я смотрю на .bash_history, я вижу это:

#1734086162
echo "Hello"
#1734086162
echo "World"

Это означает, что было создано две отдельные записи. Однако я хотел бы это:

#1734086162
echo "Hello"
echo "World"

Если я вручную адаптирую это, все работает, я могу затем Ctrl-p перейти к записи и отредактировать ее целиком с помощью Ctrl-x Ctrl-e. Но как сохранить это как многострочную команду автоматически?

Ваша версия bash:

GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

Вам нужно объединить ваши команды в Составную команду.

Например, в вашем редакторе используйте конструкцию группировки:

{
echo foo
echo bar
}

И тогда вы увидите что-то вроде { echo foo; echo bar; } в вашей истории.

Вы также можете использовать логический оператор, такой как echo foo && echo bar.

Ответ или решение

Чтобы редактировать многострочную команду в Bash с использованием комбинации клавиш Ctrl-x Ctrl-e и сохранить её как одну запись в истории, требуется учитывать особенности Bash и правильные конструкции команд. Давайте рассмотрим этот процесс более подробно.

Настройка истории Bash

Для начала, убедитесь, что у вас правильно настроены параметры истории. У вас уже установлены следующие параметры:

shopt -s cmdhist
shopt -s lithist
HISTTIMEFORMAT='%F %T '

Эти команды позволяют собирать команды, состоящие из нескольких строк, в одну запись в истории. Тем не менее, без особенных правил используемого синтаксиса они не будут работать должным образом. Чтобы ваша многострочная команда сохранялась как один элемент истории, используйте конструкции Bash для объединения команд.

Использование составного командного синтаксиса

Когда вы открываете редактор Vim для редактирования команд, объедините ваши команды, обернув их в фигурные скобки или используйте логическое "И" (&&). Например, в вашем случае, откройте редактор и напишите:

{
    echo "Hello"
    echo "World"
}

или

echo "Hello" && echo "World"

Сохранение команд в истории

После того как вы введете команду в редакторе, сохраните изменения и вернитесь в терминал. Теперь, когда вы проверите историю (например, с помощью Ctrl-p), вы увидите, что команды хранятся как один элемент. Это будет отображаться в вашей истории следующим образом:

#<timestamp>
{
    echo "Hello"
    echo "World"
}

или

#<timestamp>
echo "Hello" && echo "World"

Проверка файла .bash_history

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

cat ~/.bash_history

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

Заключение

Таким образом, для правильного редактирования многострочных команд в Bash необходимо использовать составные команды с фигурными скобками или логические операторы. Это не только упрощает использование истории, но и помогает структурировать команды более логично и удобно.

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

Оцените материал
Добавить комментарий

Капча загружается...