Respostas:
Depende do seu shell.
Este artigo exibe vários métodos.
Pessoalmente, uso o zsh, que possui uma conveniente função precmd (), que é executada antes de cada prompt.
precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt
Embora as outras perguntas listem métodos bash, eles também apelidam de cd. O Bash fornece um método inerente que encadeia apenas o prompt.
bater
O bash fornece uma variável PROMPT_COMMAND que contém um comando a ser executado antes do prompt. Este exemplo (inserido em ~ / .bashrc) define o título para "nome de usuário @ nome do host: diretório":
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
onde \ 033 é o código de caractere para ESC e \ 007 para BEL. Observe que a citação é importante aqui: variáveis são expandidas em "..." e não expandidas em '...'. Portanto, PROMPT_COMMAND é definido como um valor não expandido, mas as variáveis dentro de "..." são expandidas quando PROMPT_COMMAND é usado.
No entanto, o PWD produz o caminho completo do diretório. Se queremos usar a abreviação '~', precisamos incorporar a string de escape no prompt, o que nos permite tirar proveito das seguintes expansões de prompt fornecidas pelo shell:
\u expands to $USERNAME
\h expands to hostname up to first '.'
\w expands to directory, replacing $HOME with '~'
\[...\] embeds a sequence of non-printing characters
Assim, o seguinte produz um prompt de "bash $" e um título xterm de "nome de usuário @ nome do host: diretório" ...
case $TERM in
xterm*)
PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
;;
*)
PS1="bash\$ "
;;
esac
Observe o uso de [...] que informa ao bash para ignorar os caracteres de controle que não imprimem ao calcular a largura do prompt. Caso contrário, os comandos de edição de linha ficam confusos ao colocar o cursor.
~/.profile
arquivo (ou equivalente) na máquina remota.
Copie e cole no arquivo ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"
Isso definirá o título da guia atual do terminal com o nome da pasta em que você está (NÃO o caminho inteiro).
Então ...
Developer/Applications/Utilities/Bluetooth/
torna-se =>Bluetooth
No Mac OS X Lion 10.7, o Terminal possui uma seqüência de escape explícita para definir o diretório de trabalho, que o Terminal exibe usando o ícone "proxy" da janela padrão. Isso permite que você clique com a tecla Command pressionada para ver o caminho, revelar no Finder ou arrastá-lo como qualquer outra pasta. Além disso, o Terminal pode usar isso para criar outro terminal no mesmo diretório e restaurar o diretório de trabalho ao sair / reiniciar o Terminal (quando Continuar estiver ativado). Também permite restaurar diretórios para grupos de janelas.
É a mesma sequência de escape OSC (Comando do Sistema Operacional) dos títulos da janela e da guia, mas com o primeiro parâmetro definido como 7. O valor deve ser um URL "file:", que permite caracteres especiais de codificação percentual para que ele possa manipular todos os nomes de caminho válidos. Você também deve incluir o nome do host para que o Terminal possa determinar se é um diretório local; O Terminal evitará usá-lo como o diretório de trabalho atual, se for de um host diferente.
Em uma nota relacionada, o Terminal também suporta a configuração do "arquivo representado" usando a sequência de escape OSC com um parâmetro 6. Se definido, o ícone do proxy exibirá isso em vez do diretório de trabalho. Por exemplo, eu tenho o emacs e menos configurado para refletir o arquivo / buffer atualmente exibido no ícone do proxy. Isso permite que esses programas baseados em tty sejam mais integrados ao sistema operacional circundante.
Os comportamentos do diretório de trabalho são ativados por padrão para o bash (o shell padrão no Mac OS X). Veja / etc / bashrc para o código relevante.
Também vale a pena mencionar que o Lion Terminal agora suporta a configuração do título da guia independentemente do título da janela usando a sequência de escape do OSC.
update_terminal_cwd
função definirá o ícone do proxy para o diretório de trabalho atual. Por padrão $PROMPT_COMMAND
é update_terminal_cwd
.
Além de recomendar o uso da sequência de escape de comando do sistema operacional específica do Apple Terminal: ESC ] Ps ; Pt BEL
onde Ps
é 7
e Pt
é um file:
URL; vale a pena acrescentando que no Mac OS X 10.11 (e provavelmente desde 10,7) há um arquivo /etc/bashrc_Apple_Terminal
(não editável sob 10.11) que define o conveniente update_terminal_cwd()
como (sem os comentários):
update_terminal_cwd ()
{
local url_path='';
{
local i ch hexch LC_CTYPE=C LC_ALL=;
for ((i = 0; i < ${#PWD}; ++i))
do
ch="${PWD:i:1}";
if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
url_path+="$ch";
else
printf -v hexch "%02X" "'$ch";
url_path+="%${hexch: -2:2}";
fi;
done
};
printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
}
Você também pode usar isso em suas caixas remotas, caso esteja pensando em fazê-lo e depois coçando a cabeça para codificar corretamente o URL do arquivo no bash.
E se você mudar PROMPT_COMMAND
por conta própria .bash_profile
ou .bashrc
se esquecer de ligar para isso. No mesmo arquivo, eles mostram um exemplo de encadeamento um pouco melhor com:
PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
Pessoalmente, .bash_profile
eu queria adicionar o prompt do git, então fiz isso:
local git_path=/Applications/Xcode.app/Contents/Developer/usr/share/git-core
for f in $git_path/git-completion.bash $git_path/git-prompt.sh
do
if [[ -f "$f" ]]; then
. "$f"
fi
done
get_sha() {
git rev-parse --short HEAD 2>/dev/null
}
if [ "function" = $(type -t __git_ps1) ]; then
export GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWSTASHSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWCOLORHINTS=1
GIT_PS1_DESCRIBE_STYLE="branch"
GIT_PS1_SHOWUPSTREAM="auto git"
export PROMPT_COMMAND="$PROMPT_COMMAND${PROMPT_COMMAND:+; }"'__git_ps1 "\[\e[0;32m\]\u\[\e[1;32m\]@\h\[\e[0m\]:\[\e[0;34m\]\w\[\e[0m\]" "\$ " "\n{%s $(get_sha)}"'
fi
As soluções Bash que envolvem PS1 e PROMPT_COMMAND falham se o diretório tiver caracteres Unicode (pelo menos no Snow Leopard). A melhor solução que eu consegui foi fazer o equivalente a
PS1="\[\033]0;\`pwd | tr -dC '[\000-\177]'\`\007\]\$ "
Infelizmente, isso não funciona diretamente, então, em vez disso, defini uma função shell para fazer a tr
chamada:
termtitlefilter () { tr -dC '[\000-\177]'; }
PS1="\[\033]0;\`pwd | termtitlefilter\`\007\]\$ "
Isso funciona bem para acentos latinos, que estarão no Unicode NFD (os acentos desaparecerão, mas o caractere latino subjacente permanecerá).
Infelizmente, falhará completamente em coisas como o chinês.
Supondo que você esteja usando o Terminal MAC padrão, você pode usar o seguinte no .profile, já que "set_prompt" por si só pode enviar você para a pasta raiz quando você abre uma nova guia:
set_prompt () {
BASE_PATH="${PWD##*/}"
echo -ne "\033]0;$BASE_PATH\007"
}
set_my_tab () {
update_terminal_cwd
set_prompt
}
PROMPT_COMMAND=set_my_tab
Digite isso no seu arquivo ~ / .profile ou equivalente:
function settitle() { echo -n "]0;$@"; }
function cd() { command cd "$@"; settitle `pwd -P`; }
export PS1='\W \$ '
settitle `pwd`
A primeira linha contém dois caracteres especiais que não podem ser copiados / colados, mas você pode fazer o download do texto aqui: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .
echo
use printf
, que permite expressar esses caracteres (ESC e BEL / Control-G) com seqüências de escape:printf '\e]0;$@\a"