「こんにちは」ストリームは、プロンプトでは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
前に1行だけを残します。SIGWINCHは、WINdowサイズが変更されると自動的に送信され、bashの応答はたまたま必要な処理を実行します。
他のシェルでも動作する可能性がありますが、この100%ポータブル/ POSIXを作成しようとはしていません。(残念ながら、これはbash4.3ではなくbash4.4でのみ機能します。または、私が知らない設定に依存します)
# 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
両方のシステムで有効になって、それだけでバッシュ4.4システム(アーチの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を開いてください。コマンドの終了後、ターミナルを開いたままにするオプションを使用します。