Bash 如何使用gdb调试Bourne Shell?

Bash 如何使用gdb调试Bourne Shell?,bash,gdb,tar,Bash,Gdb,Tar,我构建了一个工具链脚本来准备Linux构建环境。可以在此处找到脚本: 在第416行Perl部分结束之前,脚本一直运行良好。Perl完成后,当它转到unzipsed时,会出现以下错误: 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: Er

我构建了一个工具链脚本来准备Linux构建环境。可以在此处找到脚本:

在第416行Perl部分结束之前,脚本一直运行良好。Perl完成后,当它转到unzip
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
user@ubuntu:~$cat/etc/lsb发布
DISTRIB_ID=Ubuntu
发行版本=14.04
DISTRIB_CODENAME=可靠
DISTRIB_DESCRIPTION=“Ubuntu 14.04.2 LTS”
user@ubuntu:~$bash--版本
GNUBash,版本4.3.11(1)-发行版(x86_64-pc-linux-GNU)
版权所有(C)2013免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件;您可以自由更改和重新分发它。
在法律允许的范围内,不存在任何担保。
user@ubuntu:~$ls-lh$(哪个bash)
-rwxr-xr-x 1根根目录998K 2014年10月7日/bin/bash
我不认为ubuntubash附带调试符号,所以我想我必须重新编译才能包含这些符号

运行脚本时,如何使用
gdb
调试shell?或者,在脚本运行时,如何将shell日志保存到文件中,以便在脚本运行完成后使用
gdb
打开它?我知道如何调试shell脚本,我不想调试脚本,我想调试shell

编辑:它看起来不像Ubuntu
bash
附带了现成的调试符号<代码>从bash读取符号…(未找到调试符号)…完成。


编辑:
$PROMETHEUS
设置在我的根shell中。在Perl
cd..
结束时,会产生相同的结果,
cd$PROMETHEUS/sources/

Shell自带了自己的调试工具。最简单的方法是使用
-x
bash-x…script…
)运行它们,它将在变量展开后但在执行之前打印每个命令。这通常足以确定问题所在

有关更多想法,请参阅

您还应该考虑编写助手函数,以将脚本的大小减少到几行。您可以将配置或后期生成步骤的特殊选项移动到额外文件中,并从helper函数(如果存在)运行这些步骤

从代码看,这一行似乎是culrit:

cd $PROMETHEUS/sources/
在其他地方,您只需使用
cd..
。如果未定义
PROMETHEUS
(脚本未定义它,它将成为
cd/sources/
,它也会失败,但不会中止脚本。请重试

cd $PROMETHEUS/sources/ || exit 1
相反,
#!/bin/bash-u
也可能有用(在未定义的变量上中止)


最后,您可以使用
pushd
popd
来浏览文件夹。

在tar中用gdb调试sh或bash可能不是最简单的方法。您
cd$PROMETHEUS/sources/
,但不返回目录。这可能是您的问题吗?看看@AlexanderO'Mara
$PROMETHEUS
是我的
.bashrc
中导出的变量。首先,我要在
tar jxvf sed-4.2.2.tar.bz2
行之前添加一个
pwd
语句,以验证工作目录是否符合预期。谢谢。:)我以前在Perl末尾尝试过
cd..
,但它产生了相同的结果。另外,
$PROMETHEUS
是我的shell中设置的全局变量。我最终将用Python重写它;也许这给了你一个暗示。