방금 중괄호 확장에 대해 배웠으며 이를 활용하여 다른 명령줄 인수를 사용하여 동일한 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
하고 sh
1 에 의해 실행됩니다 .
또 다른 방법: 이미 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
%s
parallel
{}
대화형 모드에서 입력을 저장하려는 경우 셸 설명서의 기록 확장 장을 참조해야 합니다. 예를 들어 zsh
(and setopt histexpand
)를 사용하면 다음 명령을 실행할 수 있습니다.
mpirun -n 1 main.exe 1 10 0.1 1 5
그런 다음 기록 확장을 사용하여 동일한 명령을 실행하되 0.2
6번째 인수(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
한 줄일 수도 있지만 대화형으로 실행할 때 키 입력을 저장하기가 어렵습니다.