แสดงคำสั่งในแถบหัวเรื่อง xterm


23

My Bash Prompt กำลังตั้งค่า xterm titlebar โดยใช้ลำดับต่อไปนี้:

PS1='\033]0;\u@\h>\w\007'

มีวิธีง่าย ๆ ในการแสดงคำสั่งปัจจุบันในแถบชื่อเรื่อง ตัวอย่างเช่นถ้าฉันกำลัง tailing ไฟล์โดยใช้ผมต้องการที่แถบชื่อของฉันที่จะพูดtail -f foo.logtail -f foo.log

คำตอบ:


16

โดยทั่วไปคุณต้องการ:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

ในตอนท้ายของคุณ.bashrcหรือที่คล้ายกัน ใช้เวลาสักครู่เพื่อทำงานนี้ - ดูคำตอบของฉันที่นี่สำหรับข้อมูลเพิ่มเติม :)


ขอบคุณสำหรับโซลูชันนี้ simon! อย่างไรก็ตามเมื่อเพิ่มสิ่งนี้ลง.bashrcในคำสั่งหลังแต่ละคำสั่งในเชลล์ฉันจะได้รับผลลัพธ์0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}นี้ ฉันคิดว่าฉันสามารถระงับเอาต์พุตนี้โดยกำหนดคำสั่ง Trap ให้กับPS1? อย่างไรก็ตามPS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGไม่ทำงาน bash: echo -ne "\033]0;$BASH_COMMAND\007": command not foundจะนำไปสู่ข้อผิดพลาด
orschiro

BTW ฉันเพิ่งจะส่งคำสั่งstackoverflow.com/questions/48407130/…ไปถามว่าน่าจะเป็นผลมาจากคำแนะนำนี้ กับดักควรเขียนถึง stderr หรือไปที่ TTY โดยตรงไม่ใช่เพื่อ stdout
Charles Duffy

1
@orschiro คำแนะนำในการเรียกใช้trapคำสั่งเป็นคำสั่งแยกต่างหากไม่ให้กำหนดให้กับ PS1
Charles Duffy

12

(แรงบันดาลใจจากคำตอบ SU นี้ )

คุณสามารถรวมเทคนิคการทุบตีสองสาม:

  • หากคุณดักจับสัญญาณ DEBUG ตัวจัดการจะถูกเรียกใช้ก่อนที่คำสั่งแต่ละคำสั่งจะถูกดำเนินการ
  • ตัวแปร$BASH_COMMANDเก็บคำสั่งที่กำลังดำเนินการอยู่ในปัจจุบัน

ดังนั้น Trap DEBUG และให้ตัวจัดการตั้งค่าชื่อเป็น$BASH_COMMAND:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

สิ่งนี้จะทำให้หัวเรื่องเปลี่ยนไปจนกว่าจะมีสิ่งอื่นเปลี่ยนแปลง แต่ตราบใดที่คุณ$PS1ยังคงเหมือนเดิมมันจะไม่มีปัญหา - คุณเริ่มต้นคำสั่งตัวจัดการ DEBUG จะเปลี่ยนแถบชื่อเรื่องและเมื่อคำสั่ง bash เสร็จแล้วดึงใหม่ แจ้งและรีเซ็ตแถบหัวเรื่องของคุณอีกครั้ง

เคล็ดลับที่เป็นประโยชน์พบได้ที่นี่ (รวมถึงคำตอบของ SU ที่มาจาก) ด้วย:

set -o functrace

สิ่งนี้จะทำให้ bash เผยแพร่กับดัก DEBUG ไปยัง subshells ใด ๆ ที่คุณเริ่ม; ไม่เช่นนั้นแถบหัวเรื่องจะไม่เปลี่ยนแปลง


ฮ่า! คำตอบเดียวกันในเวลาเดียวกัน! +1 สำหรับการจัดการ subshells แต่คุณมีคำตอบสำหรับปัญหาท่อหรือไม่ (ดูลิงก์ของฉันไปยังคำถาม SO)
simon

ไม่ทำงานผ่านssh
abyss.7

นอกจากนี้ "ฆ่า" การทำให้เสร็จสมบูรณ์บน "แท็บ"
abyss.7

BTW ฉันเพิ่งจะส่งคำสั่งstackoverflow.com/questions/48407130/…ไปถามว่าน่าจะเป็นผลมาจากคำแนะนำนี้ กับดักควรเขียนถึง stderr หรือไปที่ TTY โดยตรงไม่ใช่เพื่อ stdout
Charles Duffy

จะดีกว่าไหมถ้าเปลี่ยนไป/dev/ttyใช้แทนที่จะเป็น stderr?
Aaron Digulla

2

ฉันทำงานแก้ปัญหาของตัวเองจากการโพสต์ต่างๆ สิ่งนี้สร้างหัวเรื่องที่มีผู้ใช้ชื่อโฮสต์ pwd, tty และคำสั่งที่เรียกใช้งานในปัจจุบัน (สำหรับ bash)

ดูเหมือนว่านี้ (ไม่มีคำสั่งที่ถูกเรียกใช้):

.:[user@hostname:/home/user][pts/10]:.

และเช่นนี้ (รันคำสั่ง):

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

ที่ไหนสักแห่งใน. bashrc ฉันขยาย PS1:

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

เพิ่มคำสั่งปัจจุบันโดยใช้history 1และtrap :

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

รู้สึกฟรีเพื่อนำไปใช้กับความต้องการของคุณ


BTW ฉันเพิ่งจะส่งคำสั่งstackoverflow.com/questions/48407130/…ไปถามว่าน่าจะเป็นผลมาจากคำแนะนำนี้ กับดักควรเขียนถึง stderr หรือไปที่ TTY โดยตรงไม่ใช่เพื่อ stdout
Charles Duffy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.