สตรีม "hi" ถูกพิมพ์ในพรอมต์ของฉัน (ในstdin
) และไม่ใช่ในของฉันstdout
ไม่ไม่ใช่ "พิมพ์ในstdin
" ของคุณ
หากคุณกดย้อนกลับจะไม่พยายามเรียกใช้hi
เป็นคำสั่ง เป็นเพียงพื้นหลังที่echo
พิมพ์ออกมาhi
ขณะที่เคอร์เซอร์อยู่หลังพรอมต์ของคุณ
บางทีคุณอาจต้องการที่จะพิมพ์บรรทัดใหม่ชั้นนำ(sleep 1m && echo -e '\nhi' &)
เช่น (ปรับตามความจำเป็นสำหรับecho
ในเชลล์ของคุณหรือใช้printf
เพื่อการพกพา)
ฉันใส่&
ภายใน subshell ที่จะ "ปฏิเสธ" งานพื้นหลังเพื่อให้คุณหลีกเลี่ยง "เสียง" [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
คุณสามารถทำได้ด้วยตนเอง
คุณสามารถเขียนฟังก์ชั่นเชลล์ที่ได้รับทุบตีเรื่องการพิมพ์ของพรอมต์หลังจากที่echo
เสร็จสิ้น การทำเช่นecho "$PS1"
นั้นจะไม่ทำซ้ำอักขระที่พิมพ์ไปแล้ว kill -WINCH $$
ในระบบของฉันได้รับทุบตีเพื่อพิมพ์บรรทัดของพรอมต์ใหม่โดยไม่ต้องล้างหน้าจอออกจากhi
บรรทัดด้วยตัวเองก่อนที่จะแจ้งให้ SIGWINCH จะถูกส่งโดยอัตโนมัติเมื่อการเปลี่ยนแปลงขนาด WINdow และการตอบสนองของ bash นั้นเกิดขึ้นเพื่อทำสิ่งที่เราต้องการ
มันอาจใช้งานได้กับหอยอื่น ๆ แต่ฉันไม่ได้พยายามที่จะทำให้พกพา / POSIX ได้ 100% ( น่าเสียดายนี่ใช้งานได้กับ 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`
คุณสามารถสรุปได้อย่างง่ายดายในฟังก์ชั่นเชลล์ที่ใช้ arg arg sleep และข้อความ
bash 4.3 จะไม่พิมพ์พรอมต์ใหม่หลังจาก SIGWINCH ดังนั้นจึงไม่สามารถใช้งานได้ ฉันshopt -s checkwinsize
เปิดใช้งานทั้งสองระบบแล้ว แต่ใช้ได้กับระบบ Bash 4.4 (Arch Linux) เท่านั้น
หากไม่ได้ผลคุณสามารถลองใช้(sleep 2 && echo -e '\nhi' && echo "$PS1" &)
งานว่า "ทำงาน" ใดหากบรรทัดคำสั่งว่างเปล่า (นอกจากนี้ยังละเว้นความเป็นไปได้ที่PROMPT_COMMAND
ตั้งไว้)
ไม่มีวิธีที่สะอาดจริงๆในการดึงเอาท์พุทของเทอร์มินัลมาผสมกับสิ่งที่คุณอาจทำบนเทอร์มินัลในภายหลังเมื่อตัวจับเวลาเริ่มทำงาน หากคุณอยู่ตรงกลางของการเลื่อนบางอย่างless
คุณอาจพลาดได้ง่าย
หากคุณกำลังมองหาบางสิ่งที่มีผลลัพธ์เชิงโต้ตอบฉันขอแนะนำให้เล่นไฟล์เสียง เช่นกับผู้เล่นบรรทัดคำสั่งเช่นmpv
(nice fork ของ MPlayer2) หรือเลือกไฟล์วิดีโอเพื่อให้หน้าต่างใหม่เปิดขึ้น
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
คุณอาจต้องการecho
เปิด xterm / konsole / gnome-terminal ใหม่ของคุณ ใช้ตัวเลือกที่ช่วยให้เทอร์มินัลเปิดหลังจากคำสั่งออก