Xterm टाइटलबार में डिस्प्ले कमांड


23

मेरा बैश प्रॉम्प्ट वर्तमान में xterm टाइटलबार को निम्नलिखित अनुक्रम का उपयोग करके सेट कर रहा है:

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

क्या टाइटलबार में वर्तमान कमांड को प्रदर्शित करने का एक आसान तरीका है। उदाहरण के लिए, यदि मैं किसी फ़ाइल का उपयोग कर tail -f foo.logरहा हूं, तो मैं चाहता हूं कि मेरा टाइटलबार कहे tail -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/~}। मुझे लगता है कि मैं ट्रैप कमांड को बताकर इस आउटपुट को दबा सकता हूं PS1? हालांकि, PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGकाम नहीं करता है। यह त्रुटि की ओर जाता है bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found
ऑर्किरो

BTW, मैंने अभी stackoverflow.com/questions/48407130/… को फिल्माया है , इस सलाह के लागू होने के परिणामस्वरूप। जाल को सीधे stderr या TTY को लिखा जाना चाहिए, न कि stdout को।
चार्ल्स डफी

1
@orschiro, trapकमांड को एक अलग कमांड के रूप में चलाने की सलाह , PS1 को असाइन करने के लिए नहीं।
चार्ल्स डफी

12

( इस SU उत्तर से प्रेरित )

आप एक जोड़ी बैश ट्रिक को जोड़ सकते हैं:

  • यदि आप DEBUG सिग्नल को फँसाते हैं, तो प्रत्येक कमांड निष्पादित होने से पहले हैंडलर को बुलाया जाता है
  • चर $BASH_COMMANDवर्तमान में निष्पादित कमांड रखता है

इसलिए, DEBUG को ट्रैप करें और हैंडलर को शीर्षक सेट करें $BASH_COMMAND:

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

यह शीर्षक तब तक बदलता रहेगा जब तक कुछ और इसे बदल नहीं देता, लेकिन जब तक आपका $PS1वही रहता है तब तक यह समस्या नहीं होगी - आप एक कमांड शुरू करते हैं, DEBUG हैंडलर टाइटलबार को बदलता है, और जब कमांड खत्म होता है तो बैश एक नया ड्रॉ करता है शीघ्र और अपने शीर्षक पट्टी को फिर से रीसेट करता है।

यहां पाया जाने वाला एक उपयोगी टिप (यह भी कि एसयू जवाब कहां से आया है) इसमें शामिल हैं:

set -o functrace

यह आपके द्वारा शुरू किए गए किसी भी उपधारा में डिबग जाल को प्रचारित करेगा; अन्यथा टाइटलबार उनमें बदला नहीं जाएगा


हा! एक ही समय में एक ही जवाब! सब-हैंडल को संभालने के लिए +1, लेकिन क्या आपके पास पाइप की समस्या का कोई जवाब है? (एसओ प्रश्न के लिए मेरी लिंक देखें)
सिमोन

के माध्यम से काम नहीं करता हैssh
abyss.7

इसके अलावा "टैब" पर पूरा होने वाले "को मारता है"
abyss.7

BTW, मैंने अभी stackoverflow.com/questions/48407130/… को फिल्माया है , इस सलाह के लागू होने के परिणामस्वरूप। जाल को सीधे stderr या TTY को लिखा जाना चाहिए, न कि stdout को।
चार्ल्स डफी

यह बेहतर नहीं होगा बेहतर करने के /dev/ttyबजाय stderr?
एरोन दिगुल्ला

2

मैंने अपने स्वयं के समाधान के चारों ओर विभिन्न पदों से काम किया। यह उपयोगकर्ता, hostname, 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\]"

इतिहास 1 और ट्रैप का उपयोग करके वर्तमान कमांड जोड़ता है :

# 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 को।
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.