Поток "hi" напечатан в моем приглашении (в stdin), а не в моемstdout
Нет, это не "напечатано в вашем stdin".
Если вы нажмете return, он не будет запускаться hiкак команда. Просто фон echoпечатается, hiпока курсор был после вашего приглашения.
Возможно, вы хотите напечатать ведущий символ новой строки , как (sleep 1m && echo -e '\nhi' &). (Отрегулируйте по мере необходимости echoв вашей оболочке. Или используйтеprintf для переносимости.)
Я поместил &внутреннюю часть подоболочки, чтобы «отречься» от фоновой работы, чтобы вы также избежали «шума» [1]+ Done. С &&между командами, &относится ко всему соединение-командной цепи, поэтому он возвращается к оболочке приглашение сразу , а не ждать , sleepчтобы выйти , как вы получите с(sleep 1; echo ... &)
Вот что происходит (с задержкой в 1 секунду):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
Bash не знает, что echoнапечатал что-то, поэтому он не знает, что нужно перепечатать его подсказку или очистить экран. Вы можете сделать это вручную с помощью control-L.
Вы можете написать функцию оболочки, которая получает bash для повторной печати своего приглашения после echoзавершения . Просто делать echo "$PS1"не будет воспроизводить какие-либо уже напечатанные символы. kill -WINCH $$в моей системе получает bash для повторной печати строки подсказки без очистки экрана, оставляяhi строку перед самой подсказкой. SIGWINCH отправляется автоматически, когда размер окна изменяется, и ответ bash на него делает то, что мы хотим.
Это может работать с другими оболочками, но я не пытаюсь сделать это на 100% портативным / POSIX. ( К сожалению, это работает только на bash4.4, а не на bash4.3 или зависит от некоторых настроек, о которых я не знаю )
# bash4.4
peter@volta:~$ (sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
peter@volta:~$ ljlksjksajflasdf dfas # typed in 2 seconds
hi
peter@volta:~$ ljlksjksajflasdf dfas # reprinted by Bash because of `kill -WINCH`
Вы можете легко обернуть это в функцию оболочки, которая принимает спящий аргумент и сообщение.
bash 4.3 не перепечатывает свою подсказку после SIGWINCH, поэтому там это не работает. у меня естьshopt -s checkwinsize включил в обеих системах, но он работает только в системе Bash 4.4 (Arch Linux).
Если это не работает, вы можете попробовать (sleep 2 && echo -e '\nhi' && echo "$PS1" &), что «работает», если командная строка пуста. (Это также игнорирует возможность, которая PROMPT_COMMANDустановлена.)
Нет действительно чистого способа заставить вывод терминала смешиваться с тем, что вы могли бы делать на своем терминале позже, когда срабатывает таймер. Если вы находитесь в процессе прокрутки чего-то less, вы можете легко пропустить это.
Если вы ищете что-то с интерактивными результатами, я предлагаю воспроизвести аудиофайл. например, с помощью проигрывателя командной строки mpv(хороший форк MPlayer2). Или выберите видеофайл, чтобы открылось новое окно.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Возможно, вы захотите echoоткрыть новый терминал xterm / konsole / gnome. Используйте опцию, которая сохраняет терминал открытым после выхода из команды.