如何从 bash 登录 shell 查看 stdout / stderr?

如何从 bash 登录 shell 查看 stdout / stderr?

我正在尝试调试一个奇怪的问题~/.bash_profile,我想看看运行时是否有任何错误/等被打印出来。是否有一些日志或类似的东西包含登录 shell 进程的 stdout 和/或 stderr?谢谢!

该错误仅发生在第一个 root 登录 shell 中,而不会在其他上下文中重新执行或重新运行时发生 - 它与该特定上下文/环境有关。因此,来自调用终端的标准技巧(如 tee/管道输出/等)不起作用。

答案1

老实说,我自己没有尝试过,但我很确定标准输出和错误是进程启动时运行的终端。您可以通过echo "Hello world"在您的.bash_profile...中输入以下命令来检查

答案2

标准输出标准错误每次登录时都会出现在终端中。您必须注销并重新登录,以使个人资料中的更改生效。~/.bash_profile提供了 有关使用的进一步说明这里在 Ask Ubuntu 上好答案

答案3

要调试 bash 脚本,您有几种选择,其中一些甚至比重定向 stdout/stderr 更有效。

启用痕迹

您可以添加以下内容~/.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>

重定向 stdout/stderr

结合命令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

相关内容