Que fait update_terminal_cwd dans le terminal d'OS X

21

Cela me laisse perplexe depuis un certain temps maintenant. Dans $PROMPT_COMMANDle bash sous OS X, il y a une commande appelée update_terminal_cwd. Je suis sûr que ce n'est pas un bash intégré, et n'existe probablement que sous OS X. Mais je ne sais pas exactement ce qu'il fait. Quelqu'un sait?

Chong
la source

Réponses:

26

Il met à jour l'invite pour faire écho au répertoire de travail actuel (CWD) et est défini dans /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
la source
Il convient de noter que la fonction n'est définie que si vous exécutez votre shell dans l'application Apple Terminal. Si vous utilisez iTerm, il ne sera pas défini.
nwinkler
À quoi sert le escape-7 et où est-il imprimé? Où est-ce documenté? :)
Wildcard
1
@Wildcard C'est un xtermcode de contrôle pour définir le texte de la barre de titre. La documentation la plus accessible est peut-être le Linux Bash Prompt Howto . Il y a une vraie documentation dans les xtermsources, IIRC.
tripleee
2
Cette fonction est définie à la ligne 9 de /etc/bashrc_Apple_Terminal(trouvée via une astuce apprise ici ). Mais je trouve qu'à l'intérieur d'une session écran, $ PROMPT_COMMAND devient une chaîne vide, ce qui signifie qu'il /etc/bashrc_Apple_Terminaln'est probablement plus exécuté. Est-ce que tu sais pourquoi?
zyxue
1
@zyxue si vous regardez /etc/bashrc, il utilise la variable $TERM_PROGRAMpour déterminer le terminal et exécuter un correspondant /etc/bashrc_$TERM_PROGRAMs'il existe. Ainsi, dans la session d'écran, $TERM_PROGRAMn'est probablement pas défini ou est défini sur autre chose que Apple_Terminal.
David Moles
-15

Chaîne de format codée secrète opaque, '\ e] 7;% s \ a'. Suspect.

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

D'après ce que je comprends, "file: // $ HOSTNAME" est masqué de sorte que vous ne pouvez pas voir le protocole distant: espionnage de l'hôte.

user982671
la source
1
... ou $ HOSTNAME est une variable qui change en fonction du système sur lequel le script s'exécute. ?!? Paranoïaque beaucoup? Si vous pensez que le code répertorié dans l'autre réponse peut faire autre chose que l'impression à l'écran, vous ne savez pas comment fonctionne le script bash.
tubedogg
Vous n'avez pas reçu le mémo? - Vulnérabilité bash "ShellShock" web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271 Dans tous les cas 1) Origine inconnue car je n'ai pas défini cette variable d'environnement 'update_terminal_cwd' 2) On en plus, c'est une fonction. Suspecte automatiquement. Infiltration de masse. Personne ne veut ça. Peut-être que le NIST signalera les "vulnérabilités" d'Apple OSX et du navigateur Firefox / Chrome / Opera?
user982671
7
Vous continuez de démontrer que vous n'avez aucune idée de quoi vous parlez. update_terminal_cwdn'est pas une variable d'environnement, c'est le nom d'une fonction. Il est défini en texte clair dans /etc/bashrcet la printffonction n'a pas la possibilité de faire autre chose que d'imprimer des chaînes formatées à l'écran. Enfin, le lien vuln que vous avez publié implique l'exécution de fonctions arbitraires en ajoutant du texte à une définition de variable d'environnement ... ce qui n'a rien à voir avec tout ce qui est discuté ici. Et quel est le rôle des navigateurs dans les scripts shell?
tubedogg
Cela ne tente pas de répondre à la question posée (voir ici pour une analyse détaillée pour justifier cette affirmation). Veuillez réserver la boîte de réponse pour les réponses qui répondent à la question posée. Je vous remercie!
DW
1
@tubedogg haha ​​ouais, si vous faites juste cela, typeset -fil affichera toutes les fonctions "définies par l'utilisateur" et c'est comme ça que ça a surgi. S'ils essayaient de faire quelque chose de sommaire, ils ne le rendraient pas facilement visible.
Kolob Canyon