Bash

在沒有劫持提示的情況下從後台程序回顯進度

  • February 9, 2021

考慮簡單的腳本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

我怎樣才能改變這種行為?

這是時間問題:bashhello在後台啟動命令,然後顯示提示讓您輸入新命令,然後後台命令列印一些輸出。當您輸入下一個命令行(一個空的命令行,如果您只是按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 預設情況下會這樣做。

引用自:https://unix.stackexchange.com/questions/174242