我有一个相当复杂的脚本我用来登录:
`/Users/tinosino/.profile`
Shell脚本语言:Bash
如果我发现任何问题,我无法更改除请求错误修复之外的登录脚本。
每当我登录这些天,如果我运行这个:
echo $?
立刻,我明白了:
1
脚本中的某些内容失败了。
如何查明错误原因?返回错误代码的确切行?是否有可能“陷阱”某些退出代码,切换陷阱并在此时中止.profile
脚本?
我知道用-x运行Bash但是输出完全是压倒性的:复杂的脚本,数千行。
1
返回时让我控制吗?$?
这样的事情并查看罪魁祸首命令行,就像我看到退出代码一样吗?查看history
和$HISTFILE
并没有多大帮助。太复杂了。
我认为,捕获这种错误对我来说甚至可能“普遍有用”。也许甚至对其他用户也是如此?
答案 0 :(得分:1)
是的,有可能陷阱,但严重的是,如果你认为输出过于复杂和压倒性,那么你可能不是追逐它的合适人选。
好吧,假设你别无选择。首先,不要把手放在空中,说一些事情太复杂了。有人写过它,我敢打赌它们并不比你更聪明 - 实际上编写不看起来过于复杂的代码需要很高的技巧。复杂的代码很容易编写。
其次,你怎么知道有错误? $?
为1不一定是错误,可以通过条件为假来设置,这可能是预期的。
因此,有一种方法可以停止执行错误。运行脚本时,请使用bash -e script-name
运行该脚本。这通常是不好的做法,但你听起来绝望!它不会因条件陈述失败而停止。
答案 1 :(得分:0)
您也可以尝试使用strace运行命令进行调试。它将显示有关系统调用和接收信号的信息。
答案 2 :(得分:0)
Shell配置文件只是source
代替执行的常规shell脚本。 man
页面中解释了不同之处:
source filename [arguments]
Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.
因此,就像从命令行运行shell脚本一样,源代码配置文件的退出代码是在配置文件中执行的 last 命令的退出代码。因此,如果您确定/Users/tinosino/.profile
是获取命令提示符之前的最后一个配置文件,则退出代码1来自该文件中执行的最后一个命令。因此,您需要查找的是在该文件中调用exit
的点以及该文件中的最后一个命令。