ログレポートのコマンド置換で実行されたコマンドを取得する方法

ログレポートのコマンド置換で実行されたコマンドを取得する方法

作業を簡単にするには、次の点を考慮してください。

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 

他のシステムでは、日付と時刻も印刷できます。


これを行う方法に関する興味深い情報を確認してください。スクリプトで履歴を有効にするそしてスクリプト内の履歴の拡張

関連情報