Bash 循环内的历史

Bash 循环内的历史

我正在使用 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

然后,如果发生崩溃,您可以在日志文件中看到发生了什么(前提是系统有时间刷新输出缓冲区)。

相关内容