동적으로 생성된 매개변수가 도구에 제공되지 않음

동적으로 생성된 매개변수가 도구에 제공되지 않음

명령줄을 통해 도구를 호출하고 싶습니다. 동적 호출에 대한 매개변수를 생성해야 합니다. 또한 도구에 여러 매개변수를 제공해야 합니다.

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}차례로 해당 문자열의 요소로 대체됩니다.

관련 정보