Intégration au shell

Ce que l’intégration au shell facultative du terminal ajoute à un hôte, comment vérifier qu’elle fonctionne, et comment la retirer.

L’application Pulse est en anglais : les noms des boutons et des réglages sont donnés tels qu’ils apparaissent dans l’app.

Dernière mise à jour : 10 septembre 2026.

Cette page fait partie de la section Terminal du manuel.

Ce que c’est

Par défaut, le terminal retient une commande en observant ce que le shell renvoie en écho pendant que vous tapez. C’est une supposition : une ligne modifiée avec les flèches, un mot complété avec Tab, ou une commande rappelée depuis l’historique du shell lui-même peuvent ressortir faux, et une ligne d’historique obtenue par observation ne porte aucune marque.

L’intégration au shell supprime la supposition. Une fois installée, c’est l’hôte lui-même qui annonce chaque commande exactement telle que le shell s’apprête à l’exécuter, et la ligne dans History affiche un ✓ pour le signaler. Elle est facultative, ne fonctionne qu’en SSH, et l’historique des commandes est une fonction de Pulse Pro.

Ce qu’elle ajoute

Pour bash, ces lignes sont ajoutées à la fin de ~/.bashrc :

# pulse-shell-integration
__pulse_announce() { local l n; l=$(HISTTIMEFORMAT= builtin history 1); l=${l#"${l%%[! ]*}"}; n=${l%%[[:space:]]*}; [ -n "$n" ] && [ "$n" != "${__pulse_last-}" ] || return 0; __pulse_last=$n; l=${l#"$n"}; l=${l#"${l%%[! ]*}"}; printf '\033]7770;%s\007' "$(printf %s "$l" | base64 | tr -d '\n')"; }
eval "__pulse_prev=($(trap -p DEBUG))"; __pulse_prev=${__pulse_prev[2]-}
trap "__pulse_announce${__pulse_prev:+; $__pulse_prev}" DEBUG
# pulse-shell-integration end

Pour zsh, ces lignes sont ajoutées à la fin de ~/.zshrc :

# pulse-shell-integration
__pulse_announce() { printf '\033]7770;%s\007' "$(printf %s "$1" | base64 | tr -d '\n')"; }
autoload -Uz add-zsh-hook && add-zsh-hook preexec __pulse_announce
# pulse-shell-integration end

Chaque bloc n’est ajouté que si ce fichier existe déjà, et seulement s’il ne porte pas déjà le marqueur # pulse-shell-integration, si bien qu’installer deux fois ne change rien. Sous bash, si un trap DEBUG est déjà défini (par iTerm2, VS Code ou bash-preexec, par exemple), le bloc l’enchaîne au lieu de le remplacer. L’annonce elle-même est une séquence d’échappement de terminal privée, OSC 7770, qui porte la commande encodée en base64. Elle circule dans votre session SSH et nulle part ailleurs : rien n’est envoyé nulle part, sinon à votre propre terminal Pulse.

Installer

Connecté à l’hôte en SSH, ouvrez le menu ⋯ et choisissez Shell integration › Install…. Pulse colle les lignes dans la session sous forme de deux commandes cat >> … <<'PULSE', une par shell, et vous les voyez arriver dans le terminal au fil de la frappe. Rien n’est caché.

Elle prend effet à votre prochaine connexion. Le trap est défini quand le shell lit son profil, donc la session depuis laquelle vous avez installé continue comme avant. Déconnectez-vous, reconnectez-vous, et l’hôte commence à annoncer.

Avec bash 5.1 et ultérieur, le collage arrive dans l’éditeur de ligne au lieu de s’exécuter directement ; appuyez sur Retour pour l’exécuter.

Vérifier

Pour vérifier que les lignes sont en place :

grep -n pulse-shell-integration ~/.bashrc ~/.zshrc

Après vous être reconnecté, pour vérifier que le hook est actif :

trap -p DEBUG            # bash
echo $preexec_functions  # zsh

Lancez ensuite n’importe quelle commande et regardez dans History : la ligne devrait porter un ✓.

Retirer

Connecté, ouvrez le menu ⋯ et choisissez Shell integration › Remove…. Pulse supprime le bloc, du marqueur au marqueur de fin, dans chaque profil (avec sed -i.pulse-bak, qui fonctionne sous macOS et Linux, puis supprime la sauvegarde). Vous pouvez aussi supprimer les lignes à la main. Supprimer l’app de votre appareil ne touche pas à l’hôte ; les lignes restent jusqu’à ce que vous les retiriez.

Limites connues

L’historique enregistre les lignes de commande que vous lancez, sur votre appareil et dans votre propre iCloud si vous synchronisez. Une ligne que l’hôte n’a pas renvoyée en écho, ce à quoi ressemble une invite de mot de passe, est écartée avant d’être stockée, avec ou sans l’intégration. Ce qui reste sur votre appareil et ce qui en sort est détaillé dans la page de confidentialité.