如何查看bash登录shell的stdout / stderr输出?

我正在调试我的~/.bash_profile的一个奇怪问题,并且我想要能够看到它运行时是否有任何错误/等输出。是否有某个日志或其他地方包含登录shell进程的stdout和/或stderr?谢谢!
这个错误只发生在第一个root登录shell中,而不是在其他上下文中重新执行或重新运行时- 它与那特定的上下文/环境有关。因此,对于从调用终端使用tee / 管道输出/等的标准技巧都无效。

如果有的话,通常它们会在你运行的终端中打印出来。 - muru
@muru 我也是这么想的,我在~/.profile中创建了一个错误,但没有~/.bash_profile存在,错误消息没有传递过来。请查看我的未删除答案。 - stumblebee
@stumblebee,新的终端选项卡不会运行登录shell,除非您将终端仿真器配置为这样。 - muru
@muru 先生,您说得完全正确!~/.bashrc 是可以的,但是 ~/.profile 不行。我应该运行 sudo login。我会修改我的原始答案并接受这个错误。 - stumblebee
你可以在当前终端中引用该文件:source .bash_profile - vanadium
嗨。你对建议有什么反馈吗?这对社区来说非常重要。 - sancho.s ReinstateMonicaCellio
3个回答

每次登录时,stdoutstderr将在终端中显示。您必须退出并重新登录才能使个人配置文件中的更改生效。 关于如何使用~/.bash_profile,可以在Ask Ubuntu上这里找到进一步的解释,并提供了一个好的答案

说实话,我自己没有尝试过,但我很确定标准输出和错误是在进程启动后立即显示在终端上的。你可以通过在你的.bash_profile文件中添加像echo "Hello world"这样的命令来进行验证...

调试bash脚本有几种选项,其中一些甚至比重定向stdout/stderr更有效。
激活trace 您可以在~/.bash_profile中添加(仅为脚本的特定部分创建跟踪):
set -x          # activate debugging from here
<commands>
set +x          # stop debugging from here

此外,set -v 会打印出shell输入行的内容,而 set +v 则会关闭这个功能。仅凭这一点,你很可能就能找到问题所在。

重定向跟踪

使用 Bash 变量 BASH_XTRACEFD

如果将其设置为一个对应有效文件描述符的整数,Bash 将把启用了 'set -x' 时生成的跟踪输出写入该文件描述符。这样可以将跟踪输出与诊断和错误消息分开。当 BASH_XTRACEFD 被取消设置或赋予新值时,文件描述符将被关闭。将 BASH_XTRACEFD 取消设置或赋予空字符串将导致跟踪输出发送到标准错误。请注意,将 BASH_XTRACEFD 设置为2(标准错误文件描述符),然后取消设置它将导致标准错误被关闭。

因此,你可以使用:

exec 5> ~/bash_profile_ouput.txt
BASH_XTRACEFD="5"
<commands>
unset BASH_XTRACEFD

打印行号

使用Bash变量LINENO(在更复杂的情况下还可以使用BASH_LINENOBASH_SOURCE和/或FUNCNAME

echo "Executing ${LINENO}"
<commands>

重定向标准输出/错误输出

结合命令exec和重定向,可能还要使用tee。 请参考这里的答案,其中还包括了使用exec之外的其他方法/技巧。

相关:

  1. https://stackoverflow.com/questions/44249890/pipe-bash-stdout-only-in-debug-mode
  2. https://unix.stackexchange.com/questions/334382/find-out-what-scripts-are-being-run-by-bash-on-startup
  3. https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script