2

我有一个相当复杂的脚本用于登录:

`/Users/tinosino/.profile`

Shell 脚本语言:Bash

如果我发现任何问题,除了请求错误修复之外,我无法更改登录脚本。

这些天每当我登录时,如果我运行这个:

echo $?

立即,我得到:

1

脚本中的某些内容失败了。

如何查明错误的原因?返回该错误代码的确切行?是否可以“捕获”某些退出代码,打开捕获并.profile在此时中止脚本?

我知道使用 -x 运行 Bash,但输出完全是压倒性的:复杂的脚本,数千行。

  • 我可以以某种方式让它“停止”并让我控制何时1返回吗?
  • 我是否可以像$?看到退出代码一样执行类似的操作并查看罪魁祸首命令行?

看着history$HISTFILE没有太大帮助。太复杂了。

我认为捕获这种错误在未来甚至可能对我“普遍有用”。甚至可能对其他用户也是如此?

4

3 回答 3

1

是的,陷阱是可能的,但说真的,如果你认为输出过于复杂和压倒性的,那么你可能不是去追逐它的合适人选。

好吧,假设你别无选择。首先,不要把你的手臂举到空中,说一些太复杂的事情。有人写了它,我敢打赌他们并不比你聪明——事实上,编写看起来不太复杂的代码需要很高的技巧。复杂的代码很容易编写。

第二,你怎么知道有错误? $?为 1 不一定是错误,它可以通过条件为假来设置,这可能是预期的。

因此,有一种方法可以在出现错误时停止执行。运行脚本时,使用bash -e script-name. 这通常被认为是不好的做法,但你听起来很绝望!它不会因为条件语句中的失败而停止。

于 2013-03-14T17:17:29.700 回答
0

您也可以尝试使用 strace 运行该命令进行调试。它将向您显示有关系统调用和接收信号的信息。

http://en.wikipedia.org/wiki/Strace

于 2013-03-14T17:32:44.247 回答
0

Shell 配置文件只是常规的 shell 脚本,它们是source'd 而不是执行的。页面中解释了差异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 脚本一样,源配置文件的退出代码是配置文件中执行的最后一个命令的退出代码。因此,如果您确定这/Users/tinosino/.profile是在获得命令提示符之前获取的最后一个配置文件,那么退出代码 1 来自该文件中执行的最后一个命令。因此,您需要查找的只是该exit文件中调用的点以及该文件中的最后一个命令。

于 2013-03-14T18:34:28.723 回答