如何通过日志报告的命令替换来检索执行的命令

如何通过日志报告的命令替换来检索执行的命令

为了简单起见,请考虑以下事项:

x=$(java --version)
echo "x: $x"

它的工作原理如预期所示:

x: openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment Temurin-11.0.13+8 (build 11.0.13+8)
OpenJDK Client VM Temurin-11.0.13+8 (build 11.0.13+8, mixed mode)

我需要的是以下内容:

x=$(java --version)
echo "x: $x"
echo "The '???' command was executed"

因此输出应该是

x: openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment Temurin-11.0.13+8 (build 11.0.13+8)
OpenJDK Client VM Temurin-11.0.13+8 (build 11.0.13+8, mixed mode)
The 'java -version' command was executed

可以用什么来代替呢???

我已经做了一项研究,我发现set +x/-x但并不 100% 适用于这里

答案1

不确定,为什么 - 在脚本中 - 您不知道刚刚执行了哪个命令。但是,为了好玩:

exec 2>tmpfile; set -x
x=$(java --version)
set +x; exec 2>&1
awk  'sub(/^\+\+\+/, "") {print "The \"" $0 "\" command was executed."} ' tmpfile
The " java --version" command was executed.

awk命令删除(xtrace) 选项$PS4引入的字符(在本例中也是 RE 元字符)-x,然后打印所需的行。之后应删除 tmpfile。

答案2

在交互式 shell 中,当启用历史扩展时,您可以执行以下操作:

$ java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
$ command="!!"
$ echo "$command"
java -version

答案3

正如 @Arkadiusz Drabczyk 所说,!!这是执行的最后一个命令。

这个技巧还有其他有趣的使用方式,如下man bash所示:

!-n 指当前命令行减去n。

所以:!-2就是你想要的。

缺点是这只能在交互式 shell 中工作。

要在脚本中启用该行为,您需要bash使用以下选项指定它:

#!/bin/bash
set -H
set -o history
x=$(gcc -v 2>&1) # Sorry i dont like Java
echo "x is $x"
echo "Last cmd is " !-2 2>&1 >/dev/null

或者您可以history在脚本内部启用并解析其输出:

#!/bin/bash
set -o history
x=$(gcc -v 2>&1)
echo "x is $x"
last_cmd=$(history | sed -n '1s/^ * *//p')
echo "The cmd executed is $last_cmd"

该部分... | sed ...截断了命令使用的格式history。在我的系统中,history打印出:

  2142  ./test2.sh 
  2143  cat test2.sh 
  2144  history 

在其他系统上,也可以打印日期和时间。


请参阅这些有关如何进行的有趣信息在脚本中启用历史记录脚本内的历史扩展

相关内容