다른 인수를 사용하여 프로그램을 여러 번 실행하도록 중괄호 확장

다른 인수를 사용하여 프로그램을 여러 번 실행하도록 중괄호 확장

방금 중괄호 확장에 대해 배웠으며 이를 활용하여 다른 명령줄 인수를 사용하여 동일한 C++ 프로그램을 시작할 수 있기를 바랍니다.

터미널에서 실행되는 코드는 다음과 같습니다.

mpirun -n 1 main.exe 1 10 0.1 1 5

main.exe 뒤의 숫자는 내 프로그램의 입력 매개변수입니다.

나는 이런 일을하고 싶다 :

mpirun -n 1 main.exe 1 10 {0.1,0.2} 1 5

코드를 두 번 실행하고 싶습니다. 한 번은 0.1로, 한 번은 0.2를 세 번째 인수로 사용하고 싶습니다.

작동하지 않는 이유와 해결 방법은 무엇입니까?

최고

답변1

아니요, 작동하지 않습니다. 이 명령을 실행하면 버팀대 확장이 확장됩니다. 중괄호 확장만 영향을 받으며 여러 명령을 실행하지 않습니다. 귀하의 경우에는 다음과 같습니다.

mpirun -n 1 main.exe 1 10 {0.1,0.2} 1 5

간단히 다음과 같이 됩니다:

mpirun -n 1 main.exe 1 10 0.1 0.2 1 5

다른 값으로 두 번 실행하려면 다음을 수행하십시오.

for i in {0.1,0.2}; do
    mpirun -n 1 main.exe 1 10 "$i" 1 5
done

그게 실행될거야

mpirun -n 1 main.exe 1 10 0.1 1 5

이어서

mpirun -n 1 main.exe 1 10 0.2 1 5

물론, 이 특별한 경우에는 버팀대 확장이 불필요하게 복잡하므로 다음을 수행해야 합니다.

for i in 0.1 0.2; do
    mpirun -n 1 main.exe 1 10 "$i" 1 5
done

이와 같은 내용을 이해하는 데 유용한 방법은 set -x(bash를 사용한다고 가정할 때) 실제로 실행된 명령을 표시하는 것입니다.

$ set -x
$ mpirun -n 1 main.exe 1 10 {0.1,0.2} 1 5
+ mpirun -n 1 main.exe 1 10 0.1 0.2 1 5
[. . .]

를 사용하여 다시 끌 수 있지만 set +x이를 사용하면 셸이 복잡한 명령을 어떻게 확장하는지 정확히 확인하고 실제로 실행되는 내용을 검사할 수 있습니다.

답변2

이 질문은 때때로 제기되며 일반적인 합의는 for루프가 원하는 것을 달성하는 가장 좋고 안전한 방법이라는 것입니다.

그렇긴 하지만, 이와 같은 구성(예: 4개의 다른 인수)과 함께 중괄호 확장을 사용할 수 있습니다.

printf 'mpirun -n 1 main.exe 1 10 %s 1 5\n' {p1,p2,p3,p4} | sh

즉, 파이프라인을 통해 여러 명령줄을 작성 printf하고 sh1 에 의해 실행됩니다 .
또 다른 방법: 이미 gnu parallel설치한 경우 다음을 실행할 수 있습니다.

parallel mpirun -n 1 main.exe 1 10 {} 1 5 ::: {p1,p2,p3,p4}

두 경우 모두 {p1,p2,p3,p4}쉘에 의해 확장된 다음 p1 p2 p3 p4' 및 '를 사용하여 별도로(한 번에 하나씩) 사용됩니다(자리 표시자로 생각할 수 있습니다...).printf%sparallel{}


대화형 모드에서 입력을 저장하려는 경우 셸 설명서의 기록 확장 장을 참조해야 합니다. 예를 들어 zsh(and setopt histexpand)를 사용하면 다음 명령을 실행할 수 있습니다.

mpirun -n 1 main.exe 1 10 0.1 1 5

그런 다음 기록 확장을 사용하여 동일한 명령을 실행하되 0.26번째 인수(0부터 계산 시작)를 사용합니다.

!:-5 0.2 !:7*

다른 값에 대해서도 마찬가지입니다.XYZ

!:-5 XYZ !:7*

rm -rf *1: 이것은 당신이 무엇을 하고 있는지 알고 있다고 가정합니다... 다음과 같은 것을 파이프하고 싶지는 않습니다.sh

답변3

mpirun -n 1 main.exe 1 10 {0.1,0.2} 1 5

다음으로 확장

mpirun -n 1 main.exe 1 10 0.1 0.2 1 5

이것은 당신이 원하는 것이 아닐 수도 있습니다.

다음 {a,b,c}으로 확장됩니다.a b c

당신은 달리고 싶을 수도 있습니다

for x in 0.1 0.2
do
    mpirun -n 1 main.exe 1 10 "$x" 1 5
done

한 줄일 수도 있지만 대화형으로 실행할 때 키 입력을 저장하기가 어렵습니다.

관련 정보