1

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

$ 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 ответа2

1

Используйте функцию 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 .

1

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

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