Bash:Stderr 被发送到文件(当它不应该被发送到文件时!)

Bash:Stderr 被发送到文件(当它不应该被发送到文件时!)

以下代码在 macOS 上作为 的一部分/etc/bashrc_Apple_Terminal,用于在所有打开的窗口和选项卡中保存和恢复 shell 状态(请注意,因此这是非常旧的bash 3.2.57(1)-release (arm64-apple-darwin23)):

  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")
        declare -F shell_session_save_user_state >/dev/null && shell_session_save_user_state
        shell_session_history_allowed && shell_session_save_history
        echo 'completed.' >&2
    fi

这最终在 shell 退出时运行trap shell_session_update EXIT(该函数shell_session_update()运行另一个函数,该函数又包含这些行。)

上周,我发现了一个非常奇怪的问题:有时,$SHELL_SESSION_FILE包含以下行

Saving session...echo Restored session: "$(/bin/date -r 1698759014 Saving session...)"

而不仅仅是Restored session: "$(/bin/date -r 1698759014)"

似乎Saving session...正在写入此文件(不止一次!)而不是发送到 stderr。

这种情况不止一次发生的事实让我相信,这种情况的发生是由于其中几个窗口在自己的 shell 中运行此代码,并且在某些情况下 stderr 被错误地发送到此文件。

当我删除所有 .bash* 和 .profile 文件(或创建新用户)时,该行为似乎不会出现,但即使使用非常简单的 .bashrc,我也可以将其恢复 - 尽管它不会在每个窗口或每次启动时的每个选项卡。看起来“不确定”。

正如我所说,这才刚刚开始发生(可能是从 Sonoma - macOS 14 开始 - 但也可能是由于其他变化,例如更新到 python 3.12)。我怀疑这不仅仅是一个更广泛的 macOS 错误——我没有看到任何其他人看到这种行为的证据。也许与文件描述符之间的交互有关? (例如,奇怪的竞争条件?或者有什么方法可以外部的重定向 bash 看到的 stderr 的程序?)

有什么想法可能导致这种情况吗? (或者甚至是如何调试它的建议?)

更新:即使对于新用户,甚至在 zsh 上(它使用类似但不相同的 file /etc/zshrc_Apple_Terminal),我也看到了这一点。非常奇怪,并指出了我系统中相当“深”的一个问题(但也是一个独特的问题)对我来说,或者我认为我们会看到更多关于它的报道)。

(看这个“询问不同”帖子了解此问题的 macOS 相关症状。)

相关内容