Bash 스크립트에서 실행할 때 명령줄 인수가 공백으로 분할되는 것을 방지합니다.

Bash 스크립트에서 실행할 때 명령줄 인수가 공백으로 분할되는 것을 방지합니다.

다음과 같이 bash 변수에서 명령을 실행하려고 합니다.

cmd="python -m mymodule 'argument 123 456' argument2=32 argument3=234"
$cmd

작은따옴표로 묶여 있음에도 불구하고 첫 번째 문자열에서 명령줄 인수를 분할하는 것처럼 보입니다.

['argument', '123', '456', 'argument2=32', 'argument3=234']

이런 일이 발생하지 않도록 제가 할 수 있는 일이 있나요? 이스케이프된 큰따옴표 \", 백틱을 사용해 보았지만 `아무것도 작동하지 않습니다. 여전히 첫 번째 명령줄 인수가 공백으로 분할됩니다.

답변1

귀하의 경우 명령과 인수를 배열에 저장하는 것이 좋습니다.

cmd=( "python" "-m" "mymodule" "argument 123 456" "argument2=32" "argument3=324" )

다음과 같이 실행하십시오.

"${cmd[@]}"
  • 핵심은 ${cmd[@]}an을 사용하는 것처럼 배열 내용을 인용 해제 @하고 큰따옴표로 묶는 것입니다. 그러면 쉘은 마치 각 요소가 큰따옴표로 묶인 것처럼 배열 요소 목록으로 확장하여 단어 분할을 방지합니다(For 참조). 예이와 관련된 질문과 답변더 많은 정보를 알고 싶다면).

  • 또한 쉘이 개별적으로 자체 배열 요소로 처리할 각 토큰을 추가해야 합니다(예: "-m""mymodule"별도의 요소여야 합니다. 선언하면 "-m mymodule"실패할 수 있으며, 값이 없는 옵션 m mymodule또는 선행 공백을 포함하여 m값이 있는 옵션 으로 잘못 해석될 수 있음) mymodule- 보다이 Q&A더 많은 통찰력을 얻으려면).

관련 정보