Bash登录脚本:[1]错误来自何处?

时间:2013-03-14 16:58:13

标签: bash

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

`/Users/tinosino/.profile`

Shell脚本语言:Bash

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

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

echo $?

立刻,我明白了:

1

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

如何查明错误原因?返回错误代码的确切行?是否有可能“陷阱”某些退出代码,切换陷阱并在此时中止.profile脚本?

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

  • 我可以以某种方式让它“停止”并在1返回时让我控制吗?
  • 我可以选择做$?这样的事情并查看罪魁祸首命令行,就像我看到退出代码一样吗?

查看history$HISTFILE并没有多大帮助。太复杂了。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

因此,有一种方法可以停止执行错误。运行脚本时,请使用bash -e script-name运行该脚本。这通常是不好的做法,但你听起来绝望!它不会因条件陈述失败而停止。

答案 1 :(得分:0)

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

http://en.wikipedia.org/wiki/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的点以及该文件中的最后一个命令。