สะท้อนความคืบหน้าจากกระบวนการพื้นหลังโดยไม่ต้องไฮแจ็ก


10

พิจารณาสคริปต์ง่าย ๆhello:

#!/bin/bash

echo 'hello world!'

ตอนนี้จากทุบตีถ้าฉันพยายามเรียกใช้ในพื้นหลัง:

$ 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

ฉันจะเปลี่ยนพฤติกรรมได้อย่างไร

คำตอบ:


13

มันเป็นเรื่องของเวลา: bash เปิดใช้helloคำสั่งในพื้นหลังจากนั้นจะแสดงพรอมต์ให้คุณป้อนคำสั่งใหม่จากนั้นคำสั่ง background จะพิมพ์เอาต์พุตบางอย่าง เมื่อคุณป้อนบรรทัดคำสั่งถัดไป (บรรทัดคำสั่งว่างเปล่าถ้าคุณกดEnter) bash จะแสดงการแจ้งเตือนว่างานแบ็คกราวน์เสร็จสิ้นจากนั้นจะแสดงพรอมต์ถัดไป

คุณอาจต้องการทดสอบกับสคริปต์ที่เริ่มต้นด้วยsleep 3และเริ่มพิมพ์หลังจากเปิดตัวสคริปต์ในพื้นหลังเพื่อดูว่าเกิดอะไรขึ้นในจังหวะที่คุณสามารถติดตามได้

คุณสามารถทำให้ทุบตีแจ้งให้คุณทราบทันทีเมื่อสิ้นสุดงานพื้นหลังโดยการตั้งค่าตัวเลือกที่มีnotify 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 redraw บรรทัดพรอมต์โดยอัตโนมัติ Zsh ทำตามค่าเริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.