为了简单起见,请考虑以下事项:
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
在其他系统上,也可以打印日期和时间。
请参阅这些有关如何进行的有趣信息在脚本中启用历史记录和脚本内的历史扩展