Wyświetl polecenie w pasku tytułowym xterm

23

My Bash Prompt obecnie ustawia pasek tytułowy xterm w następującej kolejności:

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

Czy istnieje prosty sposób wyświetlenia bieżącego polecenia na pasku tytułowym. Na przykład, jeśli dostosowuję plik za pomocą tail -f foo.log, chcę, aby mój pasek tytułu powiedział tail -f foo.log.

dogbane
źródło

Odpowiedzi:

16

Zasadniczo potrzebujesz:

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

na końcu twojego .bashrclub podobnego. Zajęło mi to trochę czasu, aby to wypracować - zobacz moją odpowiedź tutaj, aby uzyskać więcej informacji :)

Szymon, Szymek
źródło
Dzięki za to rozwiązanie simon! Jednak dodając to do mojego .bashrcpo każdym poleceniu w mojej powłoce, otrzymuję ten wynik 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Zakładam, że mogę wyłączyć to wyjście, przypisując polecenie trap do PS1? Jednak PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGnie działa. To prowadzi do błędu bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
orschiro,
BTW, właśnie zgłosiłem stackoverflow.com/questions/48407130/... , zapytałem prawdopodobnie w wyniku zastosowania tej porady. Pułapka powinna pisać bezpośrednio do stderr lub do TTY, a nie do standardowego.
Charles Duffy
1
@orschiro, wskazówka, aby uruchomić trappolecenie jako osobne polecenie , aby nie przypisywać go do PS1.
Charles Duffy
12

(Zainspirowany tą odpowiedzią SU )

Możesz połączyć kilka sztuczek bashowych:

  • Jeśli wychwycisz sygnał DEBUG, program obsługi jest wywoływany przed wykonaniem każdego polecenia
  • Zmienna $BASH_COMMANDzawiera aktualnie wykonywane polecenie

Pułapki DEBUG i niech program obsługi ustawi tytuł na $BASH_COMMAND:

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

Spowoduje to zmianę tytułu, dopóki coś innego go nie zmieni, ale dopóki $PS1nie zmienisz tego, nie będzie problemu - uruchomisz polecenie, moduł obsługi DEBUG zmieni pasek tytułu, a gdy polecenie zakończy bash, rysuje nowy monit i ponownie resetuje pasek tytułu.

Przydatną wskazówką tutaj (również skąd pochodzi odpowiedź SU) jest:

set -o functrace

Spowoduje to, że bash propaguje pułapkę DEBUGOWĄ do wszystkich uruchomionych podpowłok; w przeciwnym razie pasek tytułu nie zostanie w nich zmieniony

Michał Mrożek
źródło
ha! ta sama odpowiedź w dokładnie tym samym czasie! +1 za obsługę podpowłoki, ale czy masz odpowiedź na problem z rurami? (patrz mój link do pytania SO)
simon
Nie działassh
abyss.7
Również „zabija” ukończenie na „karcie”
otchłań. 7
BTW, właśnie zgłosiłem stackoverflow.com/questions/48407130/... , zapytałem prawdopodobnie w wyniku zastosowania tej porady. Pułapka powinna pisać bezpośrednio do stderr lub do TTY, a nie do standardowego.
Charles Duffy
Czy nie byłoby lepiej przekierować na /dev/ttyzamiast stderr?
Aaron Digulla
2

Obejrzałem własne rozwiązanie z różnych postów. Spowoduje to utworzenie tytułu zawierającego użytkownika, nazwę hosta, pwd, tty i aktualnie wykonywaną komendę (dla bash).

Wygląda to tak (bez wykonywania polecenia):

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

I tak (wykonanie polecenia):

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

Gdzieś w .bashrc rozszerzyłem 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\]"

Dodaje bieżące polecenie, używając historii 1 i pułapki :

# 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

Dostosuj się do swoich potrzeb.

Alejandro Alanis
źródło
BTW, właśnie zgłosiłem stackoverflow.com/questions/48407130/... , zapytałem prawdopodobnie w wyniku zastosowania tej porady. Pułapka powinna pisać bezpośrednio do stderr lub do TTY, a nie do standardowego.
Charles Duffy