s如下: #!/bin/bash -xv

s如下: #!/bin/bash -xv,bash,shell,Bash,Shell,-x:在执行命令时显示命令及其参数。 -v:在读取shell输入行时显示它们 ltrace是另一个类似于strace的Linux实用程序。但是,ltrace列出了在可执行文件或正在运行的进程中调用的所有库调用。其名称本身来自库调用跟踪。例如: ltrace ./executable <parameters> ltrace -p <PID> ltrace./executable ltrace-p 将eclipse与已封装的插件和basheclipse一起使用。

-x
:在执行命令时显示命令及其参数。
-v
:在读取shell输入行时显示它们


ltrace
是另一个类似于
strace
的Linux实用程序。但是,
ltrace
列出了在可执行文件或正在运行的进程中调用的所有库调用。其名称本身来自库调用跟踪。例如:

ltrace ./executable <parameters>  
ltrace -p <PID>  
ltrace./executable
ltrace-p

将eclipse与已封装的插件和basheclipse一起使用。

对于shelled:下载zip并通过帮助将其导入eclipse->安装新软件:basheclipse的本地存档:将JAR复制到eclipse的dropins目录中

按照提供的步骤进行操作


我在

上写了一篇教程,有很多截图,你可以写“set+x”来关闭它。他确实指定了一个
bash
脚本。使用
sh-x
运行bash脚本将导致其行为完全不同!请更新您的答案。@lhunah:“sh-x”(或“bash-x”)是如何使脚本的行为完全不同的?显然,它向stderr输出跟踪信息;这是给定的(尽管在我的回答中没有提到)。但还有什么?我在Linux和MacOS X上使用“bash”作为“sh”,并没有注意到一个严重的问题。在启动和运行时都有区别。它们在Bash发行版中有完整的文档记录。这里有一个指向Bash文档的链接:“如果使用名称sh调用Bash,它会尝试尽可能地模仿sh的历史版本的启动行为,同时也符合posix标准”,并使用PS4提示符提供更多有用的信息,如:
export PS4=”+(${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}():}
Stracing脚本(即Stracing执行脚本的shell)是一种奇怪的shell调试方法(但可能适用于有限的一组问题)。我承认这很奇怪,而且非常冗长,但如果您将strace的输出限制为几个系统调用,它将变得非常有用。请注意,如果您还希望在脚本启动的进程中查找错误,则需要
strace-f
。(这会使它更加冗长很多倍,但如果您将它限制为感兴趣的系统调用,它仍然很有用).
set-e
是……这里有一个类似的问题:。感谢您的回答,我们刚刚发现了ddd。在Ubuntu 12.04.3(64位),apt sources版本不起作用。我必须从源代码处编译和安装,才能开始调试我的bash脚本。此处的说明-帮助。是的,这是一个问题。我很久以前通过一些脚本解决了这个问题--“dddbash”安装/构建DDD,删除旧版本(如果错误),安装bashdb,等等。(现在已使用此信息编辑答案)BDB当前支持英语和西班牙语。若要更改语言,请编辑文件/etc/default/BDB屏幕截图看起来很有趣,但我无法使其运行“BDB.sh:line 32:bdbSTR[1]:unbound variable”;顺便说一句,它会显示我们在代码中执行的每一步的所有设置变量的当前值吗?关于通过shell的全局变量记录shell脚本,有很多详细信息。我们可以模拟类似的shell脚本中的日志记录:而且是!幸运的是,该工具已经发展到可以找到剩余bug的地步。这是一个边界ine(另请参阅)。您应该扩展您的答案,在此处包含尽可能多的信息,至少是实际完成建议所需的最少信息,并且使用链接仅供参考。基本上,关于堆栈溢出(以及所有堆栈交换)的帖子必须是自包含的。这意味着你的答案中需要有足够的信息,这样读者就不需要离开现场去寻找方向。现在,这个答案不是这样的。这是我在查看了许多事实后发现的第一个答案,实际上表明真正的调试是可能的。标准答案是“set+x”完美匹配一个独立的答案,但几乎故意忽略关于真正调试的真正问题。我对这个答案表示赞赏
set +x
$ cat test.sh 
ARRAY=("hello there" world)

for x in $ARRAY; do
  echo $x
done

$ shellcheck test.sh 

In test.sh line 3:
for x in $ARRAY; do
         ^-- SC2128: Expanding an array without an index only gives the first element.
$ cat test.sh       
ARRAY=("hello there" world)

for x in ${ARRAY[@]}; do
  echo $x
done

$ shellcheck test.sh

In test.sh line 3:
for x in ${ARRAY[@]}; do
         ^-- SC2068: Double quote array expansions, otherwise they're like $* and break on spaces.
$ cat test.sh 
ARRAY=("hello there" world)

for x in "${ARRAY[@]}"; do
  echo $x
done

$ shellcheck test.sh
set -x
set +x
bash <<<$'set -x\nfor i in {0..9};do\n\techo $i\n\tdone\nset +x' 2>&1 >/dev/null|wc -l
21

for arg in x v n nx nv nvx;do echo "- opts: $arg"
    bash 2> >(wc -l|sed s/^/stderr:/) > >(wc -l|sed s/^/stdout:/) <<eof
        set -$arg
        for i in {0..9};do
            echo $i
          done
        set +$arg
        echo Done.
eof
    sleep .02
  done
- opts: x
stdout:11
stderr:21
- opts: v
stdout:11
stderr:4
- opts: n
stdout:0
stderr:0
- opts: nx
stdout:0
stderr:0
- opts: nv
stdout:0
stderr:5
- opts: nvx
stdout:0
stderr:5
bash <(sed '18ideclare >&2 -p var1 var2' myscript.sh) args
declare >&2 -p var1 var2
bash <(sed '18s/$/\ndeclare -p v1 v2 >\&2/;22s/^/set -x\n/;26s/^/set +x\n/' myscript) args
bash <(sed '2,3s/$/\ndeclare -p LINENO i v2 >\&2/;5s/^/set -x\n/;7s/^/set +x\n/' <(
        seq -f 'echo $@, $((i=%g))' 1 8)) arg1 arg2
arg1 arg2, 1
arg1 arg2, 2
declare -i LINENO="3"
declare -- i="2"
/dev/fd/63: line 3: declare: v2: not found
arg1 arg2, 3
declare -i LINENO="5"
declare -- i="3"
/dev/fd/63: line 5: declare: v2: not found
arg1 arg2, 4
+ echo arg1 arg2, 5
arg1 arg2, 5
+ echo arg1 arg2, 6
arg1 arg2, 6
+ set +x
arg1 arg2, 7
arg1 arg2, 8
#!/bin/bash -xv  
ltrace ./executable <parameters>  
ltrace -p <PID>