有没有一种方法可以暂停 shell 脚本的执行,以检查环境状态或执行随机命令?
alias
和 eval
结合使用可以在调用上下文中实现基本的断点功能:
#!/bin/bash
shopt -s expand_aliases
alias breakpoint='
while read -p"Debugging(Ctrl-d to exit)> " debugging_line
do
eval "$debugging_line"
done'
f(){
local var=1
breakpoint
echo $'\n'"After breakpoint, var=$var"
}
f
在断点处,您可以输入
echo $var
var=2
输入 Ctrl-d 退出断点。
由于在 while 循环中使用了 eval
,请谨慎使用。
echo "VAR_NAME=$VAR_NAME"
命令来记录变量值。function BREAKPOINT() {
BREAKPOINT_NAME=$1
echo "Enter breakpoint $BREAKPOINT_NAME"
set +e
/bin/bash
BREAKPOINT_EXIT_CODE=$?
set -e
if [[ $BREAKPOINT_EXIT_CODE -eq 0 ]]; then
echo "Continue after breakpoint $BREAKPOINT_NAME"
else
echo "Terminate after breakpoint $BREAKPOINT_NAME"
exit $BREAKPOINT_EXIT_CODE
fi
}
export -f BREAKPOINT
然后,在我们需要中断的代码行,我们会像这样调用这个函数:
# some shell script here
BREAKPOINT MyBreakPoint
# and some other shell script here
有一些解决方案,例如bash-debug。 对我来说可行的一个简单解决方案是交互式 shell。 通过添加三行代码,您可以按如下方式检查和更改变量:
假设您有脚本test.bash
A=FOO
export B=BAR
echo $A
echo $B
$ test.bash
FOO
BAR
A=FOO
export B=BAR
bash -c "$SHELL"
echo $A
echo $B
$ test.bash
$ echo $A
$ echo $B
BAR
$ exit
FOO
BAR
set -a
添加到脚本的前导部分,从而导出所有变量和函数:set -a
A=FOO
export B=BAR
bash -c "$SHELL"
echo $A
echo $B
$ test.bash
$ echo $A
FOO
$ echo $B
BAR
$ exit
FOO
BAR
set -a
A=FOO
export B=BAR
bash -c "$SHELL"
source /tmp/var
echo $A
echo $B
$ test.bash
$ echo "export A=alice" > /tmp/var
$ echo "export B=bob" >> /tmp/var
$ exit
alice
bob
while
循环期间将它们设置回TTY。 - psmears