“ hi”流将打印在提示中(在中stdin
),而不是在我的提示中stdout
不,它不是 “印在您的文件中stdin
”。
如果按回车键,它将不会尝试hi
作为命令运行。只是当光标在提示后时才echo
打印背景hi
。
也许您想打印一个领先的换行符,例如(sleep 1m && echo -e '\nhi' &)
。(根据需要echo
在您的shell中进行调整。或printf
用于可移植性。)
我将&
子外壳放在内部以“取消”后台作业,因此您也避免了的“干扰” [1]+ Done
。随着&&
命令之间,&
适用于整个复合命令链,因此它返回到shell提示符马上,而不是等待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
。
您可以编写一个shell函数,该函数使bash在echo
完成后重新打印其提示。只做echo "$PS1"
不会复制任何已经键入的字符。 kill -WINCH $$
在我的系统上,bash会在不清除屏幕的情况下重新打印其提示hi
行,而是在提示之前留一行。当WINdow大小更改时,SIGWINCH会自动发送,而bash对它的响应恰好达到了我们想要的目的。
它可能与其他shell一起使用,但是我并没有尝试使这种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`
您可以轻松地将其包装在一个带有sleep arg和一条消息的shell函数中。
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-terminal。使用一个选项,在命令退出后使终端保持打开状态。