작업을 단순하게 유지하려면 다음을 고려하세요.
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
다른 시스템에서는 날짜와 시간도 인쇄할 수 있습니다.
이를 수행하는 방법에 대한 흥미로운 정보를 확인하십시오.스크립트에서 기록 활성화그리고스크립트 내 히스토리 확장