eval을 사용하여 $@를 실행할 때 args의 공백을 보존하는 방법

eval을 사용하여 $@를 실행할 때 args의 공백을 보존하는 방법

나는 전달된 모든 것을 실행하는 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완벽하지 않습니다.

관련 정보