Lệnh hiển thị trong thanh tiêu đề xterm


23

My Prompt của tôi hiện đang thiết lập thanh tiêu đề xterm bằng cách sử dụng trình tự sau:

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

Có một cách dễ dàng để hiển thị lệnh hiện tại trong thanh tiêu đề. Ví dụ: nếu tôi đang theo dõi một tệp bằng cách sử dụng tail -f foo.log, tôi muốn thanh tiêu đề của tôi nói tail -f foo.log.

Câu trả lời:


16

Về cơ bản, bạn cần:

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

vào cuối của bạn .bashrchoặc tương tự. Mất một lúc để giải quyết vấn đề này - hãy xem câu trả lời của tôi ở đây để biết thêm thông tin :)


Cảm ơn giải pháp này simon! Tuy nhiên, khi thêm nó vào .bashrcsau mỗi lệnh trong shell của tôi, tôi nhận được kết quả đầu ra này 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Tôi giả sử rằng tôi có thể triệt tiêu đầu ra này bằng cách gán lệnh bẫy cho PS1? Tuy nhiên, PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGkhông hoạt động. Nó dẫn đến lỗi bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
orschiro

BTW, tôi vừa thực hiện stackoverflow.com/questions/48407130/ , đã hỏi có lẽ là kết quả của lời khuyên này được áp dụng. Cái bẫy nên được ghi vào thiết bị lỗi chuẩn hoặc trực tiếp đến TTY, không được xuất ra.
Charles Duffy

1
@orschiro, lời khuyên để chạy traplệnh dưới dạng một lệnh riêng biệt , không gán nó cho PS1.
Charles Duffy

12

(Lấy cảm hứng từ câu trả lời SU này )

Bạn có thể kết hợp một vài thủ thuật bash:

  • Nếu bạn bẫy tín hiệu DEBUG, trình xử lý được gọi trước khi mỗi lệnh được thực thi
  • Biến $BASH_COMMANDgiữ lệnh hiện đang thực thi

Vì vậy, bẫy DEBUG và yêu cầu trình xử lý đặt tiêu đề thành $BASH_COMMAND:

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

Điều này sẽ giữ cho tiêu đề thay đổi cho đến khi một cái gì đó thay đổi nó, nhưng miễn là bạn $PS1vẫn giữ nguyên vấn đề - bạn bắt đầu một lệnh, trình xử lý DEBUG thay đổi thanh tiêu đề và khi lệnh kết thúc bash sẽ tạo ra một cái mới nhắc nhở và đặt lại thanh tiêu đề của bạn một lần nữa.

Một mẹo hữu ích được tìm thấy ở đây (cũng là nơi mà câu trả lời SU xuất phát) là bao gồm:

set -o functrace

Điều này sẽ làm cho bash truyền bẫy DEBUG tới bất kỳ mạng con nào bạn bắt đầu; nếu không thì thanh tiêu đề sẽ không được thay đổi trong chúng


ha! cùng một câu trả lời cùng một lúc! +1 để xử lý các mạng con, nhưng bạn có câu trả lời nào cho vấn đề đường ống không? (xem liên kết của tôi với câu hỏi SO)
simon

Không hoạt động thông quassh
vực thẳm.7

Đồng thời "giết chết" việc hoàn thành trên "tab"
vực thẳm.7

BTW, tôi vừa thực hiện stackoverflow.com/questions/48407130/ , đã hỏi có lẽ là kết quả của lời khuyên này được áp dụng. Cái bẫy nên được ghi vào thiết bị lỗi chuẩn hoặc trực tiếp đến TTY, không được xuất ra.
Charles Duffy

Sẽ không tốt hơn để chuyển hướng đến /dev/ttythay vì stderr?
Aaron Digulla

2

Tôi đã làm việc xung quanh giải pháp của riêng tôi từ các bài viết khác nhau xung quanh. Điều này tạo ra một tiêu đề chứa lệnh người dùng, tên máy chủ, pwd, tty và hiện được thực thi (đối với bash).

Điều này trông như thế này (không có lệnh nào được thực thi):

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

Và như thế này (thực hiện một lệnh):

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

Ở đâu đó trong .bashrc, tôi đã mở rộng 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\]"

Thêm lệnh hiện tại, sử dụng lịch sử 1bẫy :

# 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

Hãy chấp nhận nhu cầu của bạn.


BTW, tôi vừa thực hiện stackoverflow.com/questions/48407130/ , đã hỏi có lẽ là kết quả của lời khuyên này được áp dụng. Cái bẫy nên được ghi vào thiết bị lỗi chuẩn hoặc trực tiếp đến TTY, không được xuất ra.
Charles Duffy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.