Integración con el shell

Qué añade a un host la integración opcional del terminal con el shell, cómo ver que funciona y cómo volver a quitarla.

La app Pulse está en inglés: los nombres de botones y ajustes se indican tal como aparecen en la app.

Última actualización: 10 de septiembre de 2026.

Esta página forma parte de la sección Terminal del manual.

Qué es

De serie, el terminal recuerda un comando observando lo que el shell devuelve como eco mientras escribes. Eso es una suposición: una línea editada con las flechas, una palabra completada con Tab o un comando recuperado del propio historial del shell pueden salir mal, y una fila que procede de esa observación no lleva ninguna marca.

La integración con el shell elimina las suposiciones. Una vez instalada, el propio host anuncia cada comando exactamente como el shell está a punto de ejecutarlo, y la fila de History muestra un ✓ para indicarlo. Es opcional, solo funciona por SSH, y el historial de comandos es una función de Pulse Pro.

Qué añade

Para bash, estas líneas se añaden al final 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

Para zsh, estas líneas se añaden al final 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

Cada bloque se añade solo si ese archivo ya existe, y solo si no lleva ya el marcador # pulse-shell-integration, así que instalar dos veces no cambia nada. En bash, si ya hay un trap DEBUG configurado (por iTerm2, VS Code o bash-preexec, por ejemplo), el bloque lo encadena en lugar de reemplazarlo. El anuncio en sí es una secuencia de escape privada del terminal, OSC 7770, que lleva el comando codificado en base64. Viaja dentro de tu sesión SSH y en ningún otro sitio: no se envía nada a ningún lugar salvo a tu propio terminal de Pulse.

Instalar

Mientras estás conectado al host por SSH, abre el menú ⋯ y elige Shell integration › Install…. Pulse pega las líneas en la sesión como dos comandos cat >> … <<'PULSE', uno por shell, y ves cómo llegan al terminal a medida que se escriben. No se oculta nada.

Surte efecto a partir de tu siguiente inicio de sesión. El trap se configura cuando el shell lee su perfil, así que la sesión desde la que instalaste sigue como antes. Desconéctate, vuelve a conectarte y el host empieza a anunciar.

En bash 5.1 y posteriores, el pegado queda en el editor de línea en lugar de ejecutarse directamente; pulsa Intro para ejecutarlo.

Comprobar

Para ver que las líneas están en su sitio:

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

Después de volver a iniciar sesión, para ver que el hook está activo:

trap -p DEBUG            # bash
echo $preexec_functions  # zsh

Luego ejecuta cualquier comando y mira en History: la fila debería llevar un ✓.

Quitar

Estando conectado, abre el menú ⋯ y elige Shell integration › Remove…. Pulse borra el bloque, desde el marcador hasta el marcador de fin, en cada perfil (con sed -i.pulse-bak, que funciona en macOS y Linux, y después elimina la copia de seguridad). También puedes borrar las líneas a mano. Eliminar la app de tu dispositivo no toca el host; las líneas se quedan hasta que las quites.

Limitaciones conocidas

History registra las líneas de comando que ejecutas, en tu dispositivo y en tu propio iCloud si sincronizas. Una línea que el host no devolvió como eco, que es el aspecto que tiene una solicitud de contraseña, se descarta antes de guardarse, con o sin la integración. Lo que se queda en tu dispositivo y lo que sale de él se explica en la página de privacidad.