![eval을 사용하여 $@를 실행할 때 args의 공백을 보존하는 방법](https://linux55.com/image/191108/eval%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%24%40%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%A0%20%EB%95%8C%20args%EC%9D%98%20%EA%B3%B5%EB%B0%B1%EC%9D%84%20%EB%B3%B4%EC%A1%B4%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 전달된 모든 것을 실행하는 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
완벽하지 않습니다.