O que o update_terminal_cwd faz no terminal do OS X

21

Estou intrigado com isso por um bom tempo agora. No $PROMPT_COMMANDbash do OS X, existe um comando chamado update_terminal_cwd. Tenho certeza de que não é um bash embutido e provavelmente só existe no OS X. Mas não sei exatamente o que ele faz. Alguém sabe?

Chong
fonte

Respostas:

26

Ele atualiza o prompt para ecoar o Diretório de Trabalho Atual (CWD) e é definido em /etc/bashrc:

update_terminal_cwd() {
    # Identify the directory using a "file:" scheme URL,
    # including the host name to disambiguate local vs.
    # remote connections. Percent-escape spaces.
    local SEARCH=' '
    local REPLACE='%20'
    local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
    printf '\e]7;%s\a' "$PWD_URL"
}
Paul Gilfedder
fonte
Pode ser interessante notar que a função é definida apenas se você estiver executando seu shell no aplicativo Apple Terminal. Se você estiver usando o iTerm, ele não será definido.
nwinkler
Para que serve o escape-7 e para onde é impresso? Onde isso está documentado? :)
Curinga
11
@Wildcard É um xtermcódigo de controle para definir o texto da barra de título. A documentação mais acessível é talvez o Linux Bash Prompt Howto . Existe documentação real nas xtermfontes, IIRC.
Tripleee 07/07
2
Esta função está definida na linha 9 de /etc/bashrc_Apple_Terminal(encontrada através de um truque aprendido aqui ). Mas acho que dentro de uma sessão de tela, $ PROMPT_COMMAND se torna uma sequência vazia, o que significa que /etc/bashrc_Apple_Terminalprovavelmente não será mais executado. Você sabe por quê?
Zyxue
11
@zyxue, se você olhar /etc/bashrc, ele usa a variável $TERM_PROGRAMpara determinar o terminal e executar um correspondente, /etc/bashrc_$TERM_PROGRAMse existir. Portanto, na sessão da tela, $TERM_PROGRAMprovavelmente não está definido ou está definido como algo diferente de Apple_Terminal.
18118 David Moles
-15

Seqüência de caracteres de formato codificado secreto opaco, '\ e] 7;% s \ a'. Suspeito.

local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"

Pelo que entendi, "file: // $ HOSTNAME" é mascarado para que você não possa ver o protocolo remoto: espionagem do host.

user982671
fonte
11
... ou $ HOSTNAME é uma variável que muda dependendo do sistema em que o script está sendo executado. ?!? Muito paranóico? Se você acha que o código listado na outra resposta pode fazer outra coisa senão imprimir na tela, não faz ideia de como o script bash funciona.
tubedogg
Você não recebeu o memorando? - Vulnerabilidade de bash do "ShellShock" web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271 De qualquer forma 1) Origem desconhecida porque não defini a variável de ambiente 'update_terminal_cwd' 2) Ativado Além disso, é uma função. Suspeitar automaticamente. Infiltração em massa. Ninguém quer isso. Talvez o NIST denuncie "vulnerabilidades" do Apple OSX e do navegador Firefox / Chrome / Opera?
user982671
7
Você continua demonstrando que não tem ideia do que está falando. update_terminal_cwdnão é uma variável de ambiente, é o nome de uma função. É definido em texto não criptografado /etc/bashrce a printffunção não pode fazer nada, exceto imprimir strings formatadas na tela. Finalmente, o link vuln que você postou envolve executar funções arbitrárias anexando texto a uma definição de variável de ambiente ... que não tem nada a ver com o que está sendo discutido aqui. E o que os navegadores têm a ver com scripts de shell?
tubedogg
Isso não tenta responder à pergunta que foi feita (veja aqui para uma análise detalhada para justificar esta afirmação). Reserve a caixa de respostas para respostas que respondam à pergunta que foi feita. Obrigado!
DW
11
@tubedogg haha ​​yeah, se você fizer um, typeset -fele mostrará todas as funções "definidas pelo usuário" e foi assim que isso apareceu. Se eles estavam tentando fazer algo superficial, eles não tornariam isso facilmente visível.
precisa