명령줄을 통해 도구를 호출하고 싶습니다. 동적 호출에 대한 매개변수를 생성해야 합니다. 또한 도구에 여러 매개변수를 제공해야 합니다.
COMMAND=""
for i in $VERSIONS; do
COMMAND+=" '../apache-maven-$i/bin/mvn clean'"
done
이제 다음과 같이 생성된 매개변수 목록(위에서)을 사용하여 도구를 호출하고 싶습니다.
hyperfine --export-markdown ../results.md -w 5 $COMMAND
그러나 불행히도 이는 다음과 같은 결과를 낳습니다.
Benchmark #1: '../apache-maven-3.0.5/bin/mvn
Error: Command terminated with non-zero exit code. Use the '-i'/'--ignore-failure'
option if you want to ignore this. Alternatively,
use the '--show-output' option to debug what went wrong.
내 가정은 생성된 매개변수가 $COMMAND
다중 매개변수로 인식되지 않는다는 것입니다. 단일 매개변수로 처리되는데, 이는 잘못된 것입니다. 전체 명령줄을 인쇄하고 수동으로 bash 줄에 복사하면 정상적으로 실행됩니다.
hyperfine --export-markdown ../results.md -w 5 '~/tools/apache-maven-3.8.2/bin/mvn clean' '~/tools/apache-maven-3.8.1/bin/mvn clean' '~/tools/apache-maven-4.0.0-alpha-1-SNAPSHOT/bin/mvn clean'
Bash에서 다른 도구를 호출하기 위해 여러 인수를 생성할 때 고려해야 할 특별한 사항이 있습니까?
답변1
여기서 문제는 작은따옴표가 벤치마킹하려는 명령의 일부가 되고 있다는 것입니다 hyperfine
.
대신, 모든 명령을 배열로 수집한 다음 사용한다고 가정해 보겠습니다.
commands=()
for version in "${versions[@]}"; do
commands+=( "../apache-maven-$version/bin/mvn clean" )
done
hyperfine --warmup 5 --export-markdown ../results.md "${commands[@]}"
위의 코드에서는 이것이 versions
배열이라고 가정합니다.
versions=( '3.8.1' '3.8.2' '4.0.0-alpha-1-SNAPSHOT' )
확장은 "${commands[@]}"
벤치마킹하려는 명령이며 각각 개별적으로 참조됩니다.
그러나 hyperfine
배열을 직접 사용할 수 있습니다.versions
(
IFS=,
hyperfine \
--warmup 5 \
--export-markdown ../results.md \
--parameter-list version "${versions[*]}" \
'../apache-maven-{version}/bin/mvn clean'
)
또는 더 짧은 옵션과 더 긴 대사를 선호하는 경우,
( IFS=, ; hyperfine -w 5 --export-markdown ../results.md -L version "${versions[*]}" '../apache-maven-{version}/bin/mvn clean' )
다시 말하지만, versions
위에서 보여준 것과 같은 배열이라고 가정합니다. IFS
쉼표로 설정하면 "${versions[*]}"
버전 문자열이 쉼표로 구분된 문자열로 확장됩니다. 서브셸에서 이 작업을 수행하면 IFS
호출 셸에서 수정이 방지됩니다.
쉼표로 구분된 문자열을 사용하면 --parameter-list placeholder
피연산자로 제공된 명령 문자열에서 해당 문자열이 {placeholder}
차례로 해당 문자열의 요소로 대체됩니다.