我正在尝试调试一个奇怪的问题~/.bash_profile
,我想看看运行时是否有任何错误/等被打印出来。是否有一些日志或类似的东西包含登录 shell 进程的 stdout 和/或 stderr?谢谢!
该错误仅发生在第一个 root 登录 shell 中,而不会在其他上下文中重新执行或重新运行时发生 - 它与该特定上下文/环境有关。因此,来自调用终端的标准技巧(如 tee/管道输出/等)不起作用。
答案1
老实说,我自己没有尝试过,但我很确定标准输出和错误是进程启动时运行的终端。您可以通过echo "Hello world"
在您的.bash_profile
...中输入以下命令来检查
答案2
答案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_LINENO
,BASH_SOURCE
和/或FUNCNAME
更复杂的情况下)
echo "Executing ${LINENO}"
<commands>
重定向 stdout/stderr
结合命令exec
带有重定向,并且可能tee
。查看答案这里,其中还包括除了使用之外的其他方法/“技巧” exec
。
有关的: