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

Вместо того чтобы ждать медленных команд до конца, я бы хотел запускать их в фоновом режиме. Однако, когда они заканчивают работу и печатают на стандартный вывод, я получаю (где представляет мой курсор) это:

$ slowcmd &
$ cmd_output
█
  • Перед моим курсором нет строки подсказки.
  • а также slowcmd может быть любая медленная команда (для материала, который я пробовал, я только что сказал alias slowcmd='sleep 1 && echo cmd_output')

В то время как я хотел бы что-то вроде этого:

$ slowcmd && redrawPromptString &
$ cmd_output
$ █

Где после вывода команды для меня выводится новая строка подсказки.

Что я могу сделать, чтобы сделать redrawPromptString делать то, что я хочу? я пробовал clear, kill $$ отправить ^C в терминал, и, наконец, printf "^C" (конечно, это не сработало). Я бегу Баш. (GNU bash, версия 3.2.57).

2 ответа

Решение

Использование redraw-current-line функция bind встроенный. Сначала проверьте, если это уже связано, может быть:

bind -q redraw-current-line

Я никогда не видел его привязанным по умолчанию, поэтому вам, вероятно, придется связать его. Выберите комбинацию клавиш, скажем, Ctrl+Y. Проверьте, не занято ли уже:

bind -p | grep -F '"\C-y'

Пустой вывод означает, что комбинация не используется. Если так, давайте связывать redraw-current-line к нему:

bind "\C-y":redraw-current-line

Теперь, когда фоновый процесс портится с вашей командной строкой, нажмите Ctrl+Y. Затем ваша подсказка будет перерисована вместе с любой командой, которую вы только что частично набрали (если она есть), так что вы можете продолжить, как будто ничего не произошло.

Чтобы сделать привязку постоянной, вы можете добавить приведенную выше команду к вашему ~/.bashrcно не надо. Правильный подход заключается в изменении ~/.inputrc (для пользователя) или /etc/inputrc (Для всей системы). Таким образом, любая программа, которая использует readline(3) библиотека будет подчиняться. Строка для добавления в любой файл выглядит следующим образом:

"\C-y":redraw-current-line

Но если вы создадите ~/.inputrc заново, убедитесь, что в первой строке написано $include /etc/inputrc, Это потому что до этого момента readline использовал /etc/inputrc и, возможно, ваш рабочий процесс зависит от того, что находится в этом файле. Отныне библиотека будет использовать ваши ~/.inputrc вместо; линия $include /etc/inputrc также позволяет анализировать общесистемный файл.

Для получения дополнительной информации см. help bind а также man 3 readline,

Если вы нажмете Ctrl+L, это будет частично делать то, что вы хотите. Он перерисовает текущую строку, включая все, что вы набрали до этой точки, включая позицию курсора, но очистит экран, поэтому ваш предыдущий вывод будет потерян (или в случае окна терминала в буфере прокрутки). С другой стороны, вы были готовы попробовать clearтак что, возможно, это не проблема.

Другие вопросы по тегам