나는 전달된 모든 것을 실행하는 bash 스크립트를 작성하고 있습니다. 나는 이것이 다음과 같이 작동하기를 원합니다 :
$ ./myscript.sh echo hello world
# should run 'echo hello world'
이것은 지금까지 내 스크립트입니다.
#!/bin/bash
eval "$@"
위의 예에서는 잘 작동합니다.
$ ./myscript.sh echo hello world
# successfully runs `echo hello world`
그러나 전달된 인수 중 공백이 있는 경우 공백이 여러 인수로 분할되므로 제대로 작동하지 않습니다.
$ ./myscript.sh sh -c 'echo hello world'
# runs `sh -c 'echo' 'hello' 'world'` instead of `sh -c 'echo hello world'`, so nothing is printed
bash 스크립트에서 받은 모든 인수를 공백을 해석하지 않고 평가에 전달하려면 어떻게 해야 합니까?
답변1
eval
이 경우 어떤 이점을 가져올 수 있습니까? 이것을 사용하십시오 :
"$@"
즉
.eval "$@"
여전히 필요하다고 생각되면 다음을 eval
수행하십시오.
eval "${@@Q}"
${var@Q}
Bash가 콘텐츠를 인용 및/또는 이스케이프하도록 만들어 콘텐츠를 다시 구문 분석한 후(이것이 수행하는 작업 eval
) 원래 상태로 돌아갑니다. ${var@Q}
콘텐츠를 구문 분석해야 하는 경우 유용합니다(예: ssh
피할 수 없는 원격 셸에 콘텐츠를 전달하는 경우). 추가 구문 분석을 피할 수 있다면 피하십시오. 귀하의 경우에는 를 사용하지 않음으로써 이를 수행할 수 있습니다 eval
.
이 답변Bash의 알림은 @Q
완벽하지 않습니다.