Como posso fazer a barra de título se atualizar dinamicamente depois de conectar a uma máquina remota que usa sh como o shell padrão?

1

Sempre que me conecto a uma das minhas máquinas Ubuntu remotas, o gnome-terminal reflete o fato de que estou na máquina remota no título, usando um formato parecido com "$USER"@"$(hostname -s)": "$PWD" . Eu gosto muito desse comportamento padrão, pois ele me permite saber em qual máquina estou executando os comandos.

Quando eu me conecto à minha máquina FreeBSD como um usuário que usa sh como seu shell padrão, o título para o gnome-terminal não é atualizado.

Eu coloquei o seguinte no meu arquivo .shrc:

PS1='['"$USER"'@\h \w'
case "$USER" in
    root)
        PS1="${PS1}]# "
        ;;
    *)
        PS1="${PS1}]$ "
        ;;
esac

esc="$(printf '3')"
bel="$(printf '
PS1='['"$USER"'@\h \w'
case "$USER" in
    root)
        PS1="${PS1}]# "
        ;;
    *)
        PS1="${PS1}]$ "
        ;;
esac

esc="$(printf '3')"
bel="$(printf '%pre%7')"

case "$TERM" in
    xterm)
        #cannot get this part to work
        PS1='['"${esc}"'0;'"${USER}"'@\h \w'"$bel"']'"$PS1"
        ;;
    *)
        ;;
esac
7')" case "$TERM" in xterm) #cannot get this part to work PS1='['"${esc}"'0;'"${USER}"'@\h \w'"$bel"']'"$PS1" ;; *) ;; esac

Então, aqui está o problema. Eu encontrei muitos recursos úteis, mas nenhum parece indicar como posso definir o título usando POSIX-reclamação sh. Aqui está o que achei mais útil (na verdade eu consegui definir o título no bash e no ksh usando isso como referência):

Como alterar o título de um xterm: exemplos para diferentes shells

Acho que estou quase lá, mas não consigo descobrir o que preciso dar para definir a barra de título.

    
por Harold Fischer 18.06.2018 / 21:46

1 resposta

0

Ao tentar encontrar uma maneira de obter um prompt bonito no POSIX sh, encontrei duas limitações da implementação sh do PS1 que eu tive que hackear:

  1. Embora o \w no PS1 var funcione, ele não expande $HOME para ~

  2. Embora você possa usar PS1 para atualizar o prompt no terminal, não parece possível atualizar o título do xterm usando a variável PS1 . Os caracteres ESC e BEL não conseguem definir o título como seria de esperar se estivessem usando bash ou ksh

Aqui foi o resultado final, funciona muito bem. Ele precisa ser adicionado ao seu arquivo .shrc (certifique-se de que o PS1 não esteja definido primeiro):

update_prompt() {
    case "$PWD" in
        "$HOME"*)
            pretty_pwd="~${PWD#*"${HOME}"}"
            ;;
        "/usr$HOME"*)
            pretty_pwd="~${PWD#*"/usr${HOME}"}"
            ;;
        *)
            pretty_pwd="$PWD"
            ;;
    esac

    case "$TERM" in
        xterm*|rxvt*)
            PS1="($USER@\h $pretty_pwd)\$ "
            ;;
        *)
            ;;
    esac

    printf "\033]0;(%s@$(hostname -s): %s)\007" "$USER" "$pretty_pwd"
}

update_prompt

cd() {
    command cd "$@" && update_prompt
}

Observe que o prompt será colocado entre parênteses. Este é apenas um lembrete pessoal para mim mesmo de que estou no FreeBSD e não no Ubuntu. Se você preferir um prompt com aparência mais tradicional, use isso:

update_prompt() {
    case "$PWD" in
        "$HOME"*)
            pretty_pwd="~${PWD#*"${HOME}"}"
            ;;
        "/usr$HOME"*)
            pretty_pwd="~${PWD#*"/usr${HOME}"}"
            ;;
        *)
            pretty_pwd="$PWD"
            ;;
    esac

    case "$TERM" in
        xterm*|rxvt*)
            PS1="$USER@\h $pretty_pwd\$ "
            ;;
        *)
            ;;
    esac

    printf "\033]0;%s@$(hostname -s): %s\007" "$USER" "$pretty_pwd"
}

update_prompt

cd() {
    command cd "$@" && update_prompt
}

Você provavelmente deseja remover a condição "/usr$HOME"*) se estiver no Linux. Não serve para nada, a menos que você esteja no FreeBSD, onde /home é tipicamente um link simbólico para /usr/home .

    
por 02.07.2018 / 00:12