我构建了一个工具链脚本来准备一个Linux构建环境。脚本可以在这里找到:https://github.com/mynameismevin/prometheus/blob/toolchain/ptool-make.sh
脚本完美地运行,直到Perl部分在第416行前后运行。在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附带了调试符号,所以我假设我必须重新编译才能包含这些符号?
当我运行脚本时,我将如何使用gdb来调试shell?或者,如何在脚本运行时将shell日志保存到文件中,以便在脚本运行完成后用gdb打开它?我知道如何调试shell脚本,我不想调试脚本,我想调试shell。
编辑:看起来并不是随带调试符号的开箱即用的。Reading symbols from bash...(no debugging symbols found)...done.
编辑:$PROMETHEUS设置在我的根shell中。在Perl的末尾,cd ..会产生相同的结果,一个cd $PROMETHEUS/sources/。
发布于 2015-06-16 17:56:33
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导航文件夹。
https://stackoverflow.com/questions/30874479
复制相似问题