Есть ли команда, чтобы заставить 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
так что, возможно, это не проблема.