我构建了一个工具链脚本来准备Linux构建环境。该脚本可在此处找到:https://github.com/mynameismevin/prometheus/blob/toolchain/ptool-make.sh
该脚本运行完美,直到第416行的Perl部分之后。完成Perl后,当它解压缩sed
时,它会抱怨此错误:
tar (child): sed-4.2.2.tar.bz2: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
但是,如果我手动运行这些部分,它会完成而不会出错。如果我将脚本分成ptool-make1.sh
(以Perl结尾)和ptool-make2.sh
(从sed开始)并按顺序运行它们,那么它们都完成而没有任何问题。此时,我断言问题不在于脚本,我想调试shell以查看它是否与shell有关。
以下是一些有用的配置:
user@ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"
user@ubuntu:~$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
user@ubuntu:~$ ls -lh $(which bash)
-rwxr-xr-x 1 root root 998K Oct 7 2014 /bin/bash
我不认为Ubuntu bash带有调试符号,所以我想我必须重新编译才能包含那些?
运行脚本时,如何使用gdb
调试shell?或者在脚本运行时如何将shell记录到文件中,以便在完成后用gdb
打开它?我知道如何调试shell脚本,我不想调试脚本,我想调试shell。
编辑:它看起来不像Ubuntu bash
带有开箱即用的调试符号。 Reading symbols from bash...(no debugging symbols found)...done.
编辑:我的root shell中设置了$PROMETHEUS
。在Perl cd ..
结束时会产生相同的结果cd $PROMETHEUS/sources/
。
答案 0 :(得分:2)
shell带有自己的调试工具。最简单的是使用-x
(bash -x ...script...
)运行它们,它将在变量扩展之后但在执行之前打印每个命令。这通常足以确定问题。
有关更多提示,请参阅How to debug a bash script?
您还应该考虑编写辅助函数以将脚本的大小减少到几行。您可以移动特殊选项以将步骤配置或后构建到额外文件中,并在辅助函数中运行它们(如果存在)。
查看代码,似乎这一行是罪魁祸首:
cd $PROMETHEUS/sources/
在其他任何地方,您只需使用cd ..
。如果PROMETHEUS
未定义(脚本没有定义它,那么它将成为cd /sources/
,它也会失败,但不会中止您的脚本。尝试
cd $PROMETHEUS/sources/ || exit 1
代替。另外#!/bin/bash -u
可能有用(对未定义的变量进行中止)。
最后,您可以使用pushd
和popd
来浏览文件夹。