Answers:
set -x
或set -o xtrace
展开变量并在该行之前打印一点+号。
set -v
或set -o verbose
在打印之前不展开变量。
使用set +x
和set +v
关闭以上设置。
在脚本的第一行,可以将#!/bin/sh -x
(或-v
)效果与脚本的稍后set -x
(或-v
)效果相同。
以上也适用于/bin/sh
。
有关set
属性和调试,请参见bash-hackers的Wiki 。
$ cat shl
#!/bin/bash
DIR=/tmp/so
ls $DIR
$ bash -x shl
+ DIR=/tmp/so
+ ls /tmp/so
$
set -x
会给你你想要的。
这是一个示例shell脚本来演示:
#!/bin/bash
set -x #echo on
ls $PWD
这将展开所有变量并在命令输出之前打印完整命令。
输出:
+ ls /home/user/
file1.txt file2.txt
set -o verbose
或set -v
(仅“详细”)或set -o xtrace
或set -x
(仅“ xtrace”)或set -xv
(两者)或set -o xtrace -o verbose
(两者)。
我使用一个函数来回显并运行命令:
#!/bin/bash
# Function to display commands
exe() { echo "\$ $@" ; "$@" ; }
exe echo hello world
哪个输出
$ echo hello world
hello world
对于更复杂的命令管道等,可以使用eval:
#!/bin/bash
# Function to display commands
exe() { echo "\$ ${@/eval/}" ; "$@" ; }
exe eval "echo 'Hello, World!' | cut -d ' ' -f1"
哪个输出
$ echo 'Hello, World!' | cut -d ' ' -f1
Hello
++ set +x
关闭电源时的输出,并且看起来更干净。但是,对于仅一个或两个语句,使用子shell的bhassel答案是最方便的。
set +x
,它影响所有命令,太多了!
cp "foo bar" baz
和cp foo "bar baz"
。因此,向用户显示进度信息非常有用;调试输出或记录可重现命令的内容更少。不同的用例。在中zsh
,您可以保留带:q
修饰符的引号:exe() { echo '$' "${@:q}" ; "$@" ; }
eval
从命令中删除单词的其他实例。因此,不要指望它能正常工作exe eval "echo 'eval world'"
!
shuckc的答案回送选线有几个缺点:你最终有以下set +x
命令进行回应,以及,你失去与测试退出代码的能力$?
,因为它在被覆盖set +x
。
另一种选择是在子shell中运行命令:
echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )
if [ $? -eq 0 ] ; then
echo "curl failed"
exit 1
fi
这将为您提供如下输出:
getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed
但是,这确实会产生为命令创建新的子外壳的开销。
++ set +x
输出的好方法。
if [ $? -eq 0 ]
为if (set -x; COMMAND)
。
另一个选择是在脚本的顶部而不是在命令行的顶部放置“ -x”:
$ cat ./server
#!/bin/bash -x
ssh user@server
$ ./server
+ ssh user@server
user@server's password: ^C
$
./myScript
和之间,这似乎并不完全相同bash myScript
。还是要指出一件好事,谢谢。
2.3.1。在整个脚本上调试
$ bash -x script1.sh
...
现在,可以在SourceForge上使用Bash的完整调试器。从3.x开始,大多数现代版本的Bash中都提供了这些调试功能。
2.3.2。在脚本的一部分上进行调试
set -x # Activate debugging from here w set +x # Stop debugging from here
...
表2-1。设置调试选项概述
Short | Long notation | Result
-------+---------------+--------------------------------------------------------------
set -f | set -o noglob | Disable file name generation using metacharacters (globbing).
set -v | set -o verbose| Prints shell input lines as they are read.
set -x | set -o xtrace | Print command traces before executing command.
...
或者,可以通过在第一行shell声明中添加所需的选项,在脚本本身中指定这些模式。可以组合选项,这与UNIX命令通常一样:
#!/bin/bash -xv
您可以使用选项在调试模式下执行 Bash脚本-x
。
这将回显所有命令。
bash -x example_script.sh
# Console output
+ cd /home/user
+ mv text.txt mytext.txt
您也可以将-x选项保存在脚本中。只需-x
在shebang中指定选项即可。
######## example_script.sh ###################
#!/bin/bash -x
cd /home/user
mv text.txt mytext.txt
##############################################
./example_script.sh
# Console output
+ cd /home/user
+ mv text.txt mytext.txt
bash -vx
将执行相同的操作,但没有变量插值
对于csh
和tcsh
,您可以set verbose
或set echo
(或者甚至可以同时设置两者,但是大多数情况下可能会导致某些重复)。
的 verbose
选项几乎可以打印您键入的确切的shell表达式。
该echo
选项更能指示将通过产卵执行的操作。
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose
If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo
If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.