Поток "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. Используйте опцию, которая сохраняет терминал открытым после выхода из команды.