Повторний прогрес у фоновому процесі без підказки про викрадення


10

Розглянемо простий сценарій hello:

#!/bin/bash

echo 'hello world!'

Тепер від bash, якщо я спробую запустити це у фоновому режимі:

$ hello &
[1] 12345
$ hello world!
 <--- prompt is stuck here until I hit enter!
[1]+ Done
$  <--- prompt back to normal

Що я хотів би побачити:

$ hello &
[1] 12345
[1]+ hello world!
[1]+ Done
$  <--- prompt normal the whole time

Як я можу змінити поведінку?

Відповіді:


13

Справа в терміні: bash запускає helloкоманду у фоновому режимі, потім відображає підказку, щоб дозволити вам ввести нову команду, потім команда background надрукує деякий вихід. Коли ви вводите наступний командний рядок (порожній командний рядок, якщо ви просто натискаєте Enter), bash відображає повідомлення про те, що фонове завдання закінчено, а потім наступний рядок.

Можливо, ви захочете поекспериментувати зі сценарієм, який починається sleep 3і почати вводити текст відразу після запуску сценарію у фоновому режимі, щоб побачити, що відбувається з темпом, який ви можете слідувати.

Ви можете змусити bash сповіщати вас негайно, коли фонове завдання припиняється, встановивши notifyпараметр з set -b. Тоді ви побачите:

$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done

Bash не перемальовує підказку в цьому випадку. Ви все ще редагуєте командний рядок у рядку підказок, який з’явився перед друком фонового завдання hello world!. Ви можете перемалювати поточний рядок, натиснувши Esc 1 Ctrl+ L. Ви можете прив’язати команду redraw-current-lineдо більш зручного ключа; наприклад, щоб Ctrl+ Lперемалювати поточний рядок і Ctrl+ Alt+ Lочистити екран, додайте наступні рядки до свого ~/.inputrc:

"\C-l": redraw-current-line
"\e\C-l": clear-screen

Я не знаю, як зробити так, щоб Баш автоматично перемальовував рядок підказки. Zsh робить це за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.