Bash
在沒有劫持提示的情況下從後台程序回顯進度
考慮簡單的腳本
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
我怎樣才能改變這種行為?
這是時間問題:bash
hello
在後台啟動命令,然後顯示提示讓您輸入新命令,然後後台命令列印一些輸出。當您輸入下一個命令行(一個空的命令行,如果您只是按Enter
)時,bash 會顯示後台作業已完成的通知,然後是下一個提示。您可能想要試驗一個腳本,
sleep 3
該腳本以在後台啟動腳本後開始並開始輸入,以您可以遵循的速度查看正在發生的事情。當後台作業終止時,您可以通過設置
notify
選項使 bash 立即通知您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
我不知道如何讓 bash 自動重繪提示行。Zsh 預設情況下會這樣做。