作業を簡単にするには、次の点を考慮してください。
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
対話型シェルで履歴拡張が有効になっている場合は、次のことができます。
$ 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
それはあなたが望むものです。
欠点は、これが対話型シェルでのみ機能することです。
スクリプトでこの動作を有効にするには、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
他のシステムでは、日付と時刻も印刷できます。
これを行う方法に関する興味深い情報を確認してください。スクリプトで履歴を有効にするそしてスクリプト内の履歴の拡張