9 votos

Errores de inicio de Terminal de Apple (guardado/restauración de sesión)

Recientemente (posiblemente con la actualización Sonoma, pero posiblemente incluso más reciente que 14.0), Apple Terminal ha estado dando el siguiente error al iniciar (cuando macOS está configurado para restaurar ventanas, es decir, cuando Configuración del Sistema > Cerrar ventanas al salir… está desmarcado):

fecha: formato de hora no válido
uso: fecha [-jnRu] [-I[fecha|horas|minutos|segundos]] [-f formato_entrada]
            [-r nombre_archivo|segundos] [-v[+|-]val[d|m|w|d|H|M|S]]
            [[[[mm]dd]HH]MM[[cc]yy][.SS] | nueva_fecha] [+formato_salida]
-bash: Saving: comando no encontrado

o, en el caso de zsh,

/Users/jaffe/.zsh_sessions/.sesión:2: comando no encontrado: Saving

Desde que publiqué originalmente esta pregunta (ver actualizaciones a continuación), ha quedado claro que el error parece ocurrir en varias versiones de macOS, en Intel y Apple Silicon. No parece deberse a software instalado o archivos de configuración.

He rastreado este error a un error proveniente de /etc/bashrc_Apple_Terminal (o /etc/zshrc_pple_Terminal) que se ocupa principalmente de guardar y restaurar sesiones para las diversas pestañas y ventanas del terminal. (La mayoría de lo siguiente se referirá específicamente a los síntomas con bash pero es similar para zsh.)

Viene de las líneas

    if [ -r "$SHELL_SESSION_FILE" ]; then
    . "$SHELL_SESSION_FILE"
    rm "$SHELL_SESSION_FILE"
    fi

En el inicio del shell, este fragmento se ejecuta, y luego elimina, "$SHELL_SESSION_FILE", que se escribe al salir del shell por las siguientes líneas:

    if [ -n "$SHELL_SESSION_FILE" ]; then
        echo -ne '\nGuardando sesión...' >&2
        (umask 077; echo 'echo Sesión restaurada: "$(/bin/date -r '$(/bin/date +%s)')"' >| "$SHELL_SESSION_FILE")
        declare -F shell_session_save_user_state >/dev/null && shell_session_save_user_state
        shell_session_history_allowed && shell_session_save_history
        echo 'completado.' >&2
    fi

El error ocurre porque $SHELL_SESSION_FILE contiene incorrectamente el siguiente texto:

Guardando sesión...echo Sesión restaurada: "$(/bin/date -r 1698759014 Guardando sesión...)"

en lugar de echo Sesión restaurada: "$(/bin/date -r 1698759014) Por alguna razón, el texto Guardando sesión... aparece en el archivo (¡dos veces!) -- se envía a "$SHELL_SESSION_FILE" en lugar de stderr (a través de >&2).

Creo que no hice ningún cambio para causar esto, pero tal vez me equivoque. El directorio ~/bash_sessions/ parece tener archivos recientes con este error, y archivos ligeramente más antiguos (¡tan recientes como ayer!) que no lo tienen. Actualizo regularmente varios paquetes con homebrew, y recientemente instalé Python 3.12 de python.org, pero no veo cómo podrían afectar al inicio del shell.


Actualización: De hecho, veo esto incluso con un usuario nuevo, ¡e incluso si uso zsh en lugar de bash! (Apple Terminal tiene un código muy similar para la gestión del historial de sesiones bajo zsh). Así que parece que algún otro cambio reciente en mi sistema está causando esto. Pero sospecho que no es simplemente un problema de Sonoma, ya que no parece ser generalizado. ¡Ay!

Actualización 1a: Tenga en cuenta que el código se ejecuta via trap shell_session_update EXIT. El error parece ocurrir solo cuando salgo del shell al cerrar Terminal.app, pero no cuando uso el comando exit. (Incluso he intentado enviar explícitamente varios señales al shell a través de kill -n, pero no puedo inducir el error de esa manera).

Actualización 2: ¡Al menos otra persona está viendo esto! ¿Quizás esto indica un problema con VS Code?

Actualización 3: Después de algo de ida y vuelta en los comentarios a continuación, está claro que el error abarca múltiples versiones de macOS en ambas arquitecturas, y parece que hemos eliminado a VS Code y posiblemente Python (parece que estamos usando diferentes versiones e instaladores) como la causa; he eliminado /opt/homebrew y reiniciado y todavía veo el problema. ¿Es posible que alguna de estas cosas de alguna manera "contamine" el entorno -- por ejemplo, /etc/ -- de alguna manera que permanezca en su lugar?

Actualización 4: Inspirado por una interacción en TidBits, intenté usar la excelente máquina virtual ligera y aislada de Howard Oakley, ViableS. No instalé nada, nunca, nada, y no agregué archivos a ~/ o en ningún otro lugar. Pero después de iniciar y reiniciar Terminal.app con algunas pestañas, y asegurarme de que "cerrar ventanas al salir" esté desmarcado, inmediatamente recibí el mensaje

/Users/jaffe/.zsh_sessions/.sesión:2: comando no encontrado: Saving

Esto parece apuntar, casi de manera concluyente, a un error de macOS. Pero aún no entiendo cómo hay personas reportando que no lo ven.


¿Alguien más está viendo esto? ¿Hay alguien que explícitamente no lo esté viendo? ¿Alguna idea de qué está sucediendo (o incluso sugerencias de depuración)?

He planteado una versión más específica de esta pregunta en Unix & Linux SA.

2voto

demonchand Puntos 1291

Dado que se me ha pedido hacerlo en .zsh_sessions producing an error, aquí publico el hecho de que comentar la línea de echo hizo que el problema desapareciera en un caso similar:

Comenté la línea echo -ne en etc/zshrc_Apple_Terminal y el problema desapareció

  shell_session_save() {
    # Guardar el estado actual.
    if [ -n "$SHELL_SESSION_FILE" ]; then
        # echo -ne '\nSaving session...' >&2
        (umask 077; echo 'echo Restored session: "$(/bin/date -r '$(/bin/date +%s)')"' >| "$SHELL_SESSION_FILE")

Según la sugerencia de un usuario, se puede reemplazar por

print -u 2 $'\nSaving session ...'

2voto

Kuba Suder Puntos 111

¡Vi esto hoy! No lo había visto antes. Estoy en Monterey (12.7.1 21G920).

Reinicié mi MacBook hoy (sin instalar la actualización, solo un reinicio normal). Después de que se reiniciara, noté que no restauró correctamente todas mis pestañas de Terminal, sino que restauró el estado de alrededor del 2 de noviembre.

Creo que más tarde cerré la Terminal de nuevo, y después de abrirla de nuevo, vi esto en cada pestaña restaurada:

/Users/kuba/.zsh_sessions/C6E94843-05DC-43CC-933E-5190FC8E0825.session:2: command not found: Saving

No había visto ese mensaje antes. Tengo la sospecha de que podría tener algo que ver con por qué la Terminal restauró el estado de las pestañas desde el 2 de noviembre en lugar de antes del reinicio... ¿tal vez cambiaron la forma en que se almacenan las sesiones en alguna actualización reciente? (¿actualizaron zsh a alguna nueva versión?)

(Más información: No tengo VS Code instalado, tengo Homebrew instalado, pero no muchos paquetes en él, y también MacPorts.)

2voto

Scott Marks Puntos 101

Creo que lo he descubierto. Ejecutar múltiples sesiones de Terminal al apagar puede causar una condición de carrera en la escritura del archivo de historial. Vea mi respuesta https://stackoverflow.com/questions/62316487/terminal-modified-permanently-by-vscode/77424721#77424721

Pero no tiene nada que ver con VSCode; es un error de Apple. Aquí está mi solución:

scott@Mac-mini-x86 etc $ diff  bashrc_Apple_Terminal.orig bashrc_Apple_Terminal 
215,219c215,223
<       echo -ne '\nGuardando sesión...' >&2
<       (umask 077; echo 'echo Sesión restaurada: "$(/bin/date -r '$(/bin/date +%s)')"' >| "$SHELL_SESSION_FILE")
<       declare -F shell_session_save_user_state >/dev/null && shell_session_save_user_state
<       shell_session_history_allowed && shell_session_save_history
<       echo 'completado.' >&2
---
>       local save_lock_file="$SHELL_SESSION_DIR/_saving_lockfile"
>       if /usr/bin/shlock -f "${save_lock_file}" -p $$; then
>           (umask 077; echo 'echo Sesión restaurada: "$(/bin/date -r '$(/bin/date +%s)')"' >| "$SHELL_SESSION_FILE")
>           echo -ne '\nGuardando sesión...' >&2
>           declare -F shell_session_save_user_state >/dev/null && shell_session_save_user_state
>           shell_session_history_allowed && shell_session_save_history
>           echo 'completado.' >&2
>           /bin/rm "${save_lock_file}"
>       fi

Tenga en cuenta que es bastante trivial; simplemente bloquea para serializar la actualización del archivo de historial.

1voto

Oskar Puntos 1242

Dado que ha determinado que sus archivos de inicio están causando esto (probando con una nueva cuenta de usuario sin personalizaciones), tomaría los siguientes enfoques.

  1. Ejecute sus archivos modificados a través de un linter. Shell check es excelente en mi experiencia: https://www.shellcheck.net/
  2. Establezca la bandera de depuración para bash al principio de su script.
  3. Revise de cerca cualquier uso de la variable que identificó como siendo sobrescrita.

Para el ítem 2, tal vez pueda establecer temporalmente una shell alterna y luego llamar a bash:

/bin/bash -lixc exit 2>&1 | less

si su archivo está sucio, necesitaremos analizar por qué sus personalizaciones están rompiendo la generación de ese archivo en la función shell_session_save, en mi sistema esto es como sigue:

yo@mac ~ % which shell_session_save
shell_session_save () {
    if [ -n "$SHELL_SESSION_FILE" ]
    then
        echo -ne '\nGuardando sesión...' >&2
        (
            umask 077
            echo 'echo Restaurar sesión: "$(/bin/date -r '$(/bin/date +%s)')"' >| "$SHELL_SESSION_FILE"
        )
        whence shell_session_save_user_state > /dev/null && shell_session_save_user_state "$SHELL_SESSION_FILE"
        local f
        for f in $shell_session_save_user_state_functions
        do
            $f "$SHELL_SESSION_FILE"
        done
        shell_session_history_allowed && shell_session_save_history
        echo 'completado.' >&2
    fi
}

Lo que es curioso es que se informa que zsh también tiene un problema curiosamente similar.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X