我正在使用 bash 执行具有 for 和 wile 循环的复杂脚本。我使用以下命令激活脚本中的历史记录:
set -o history -o histexpand
但是如果我执行以下脚本:
#!/bin/bash
set -o history -o histexpand
for i in 1 2 3 4 5
do
echo "Welcome $i times"
done
history
我可以看到“历史记录”不跟踪 for 循环内的命令:
[scripts]$ ~/test2.sh
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
1 for i in 1 2 3 4 5; do echo "Welcome $i times"; done
2 history
有没有办法也跟踪 for 循环内的命令?在本示例中,我希望得到以下结果:
[scripts]$ ~/test2.sh
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
1 for i in 1 2 3 4 5; do echo "Welcome $i times"; done
2 echo "Welcome $i times"
3 echo "Welcome $i times"
4 echo "Welcome $i times"
5 echo "Welcome $i times"
6 echo "Welcome $i times"
7 history
答案1
“历史”是“先前输入的”命令的历史。
来自 GNU手动的:
“当启用 set 内置命令的 -o History 选项时......shell 提供对命令历史记录的访问,即先前键入的命令列表。”
因此,它既不替代 shell 变量,也不保存循环迭代。
为此,您可以通过调用脚本来使用 bash 调试:
bash -x myscript > to-my-log-file
然后,如果发生崩溃,您可以在日志文件中看到发生了什么(前提是系统有时间刷新输出缓冲区)。