문제

선이 포함 된 SH 스크립트가 있습니다

$PHP_COMMAND -r 'echo get_include_path();'

이 스크립트를 편집 할 수는 없지만 최종 명령 줄이 필요합니다 (동일)

php -d include_path='/path/with spaces/dir' -r 'echo get_include_path();'

이것을 어떻게 달성 할 수 있습니까?


아래는 문제를 보여주는 스크립트입니다.

#!/bin/sh

# shell script quoting problem demonstration

# I need to be able to set a shell variable with a command with 
# some options, like so
PHP_COMMAND="php -d 'include_path=/path/with spaces/dir'"
# then use PHP_COMMAND to run something in another script, like this:
$PHP_COMMAND -r 'echo get_include_path();'
# the above fails when executed. However, if you copy/paste the output
# from this line and run it in the CLI, it works!
echo "$PHP_COMMAND -r 'echo get_include_path();'"
php -d include_path='/path/with spaces/dir' -r 'echo get_include_path();'
# what's going on?

# this is also interesting
echo "\n--------------------"

# this works great, but only works if include_path doesn't need quoting
PHP_COMMAND="php -d include_path=/path/to/dir"
echo "$PHP_COMMAND -r 'echo get_include_path();'"
$PHP_COMMAND -r 'echo get_include_path();'

echo "\n--------------------"

# this one doesn't when run in the sh script, but again if you copy/paste 
# the output it does work as expected.
PHP_COMMAND="php -d 'include_path=/path/to/dir'"
echo "$PHP_COMMAND -r 'echo get_include_path();'"
$PHP_COMMAND -r 'echo get_include_path();'

스크립트도 온라인에서 사용할 수 있습니다. http://gist.github.com/276500

도움이 되었습니까?

해결책

더 간단한 방법이 있어야하지만 한 가지 수정 사항은 전체 명령 줄을 이중 인용문으로 둘러싸고 다음을 평가하는 것입니다.

PHP_COMMAND="php -d 'include_path=/path/with spaces/dir'"
eval "$PHP_COMMAND -r 'echo get_include_path();'"

다른 팁

다른 답변에 대한 귀하의 의견을 읽으면서, 나는 당신이 실제로 물어보고자하는 것을 해독하려고 노력했습니다.

나는있다 sh 줄이 포함 된 스크립트

$PHP_COMMAND -r 'echo get_include_path();'

이 스크립트를 편집 할 수는 없지만 최종 명령 줄이 필요합니다 (동일)

php -d include_path='/path/with spaces/dir' -r 'echo get_include_path();'

이것을 어떻게 달성 할 수 있습니까?

이것이 당신의 상황을 정확하게 반영한다면, 이것은 한 가지 방법입니다.

다른 스크립트를 작성하십시오 (전화 할게요 /some/path/to/bar.sh) AS를 사용합니다 PHP_COMMAND. 변수는 원본 스크립트에 인용되지 않으므로 전체 경로 이름이 bar.sh 공백과 같은 쉘 전문 문자가 없습니다.

/some/path/to/bar.sh

#!/bin/sh
exec php -d 'include_path=/path/with spaces/dir' ${1+"$@"}

그런 다음 실행하려면 설정하십시오 PHP_COMMAND, 원본 스크립트를 실행합니다 (/path/to/foo.sh):

env PHP_COMMAND=/some/path/to/bar.sh '/path/to/foo.sh'

배쉬 printf 도움이 될 수있는 특별한 비밀 마법이 있습니다. 노력하다:

PHP_COMMAND="php -d $(printf "%q" "'include_path=/path/to/dir'")"

또는 그것의 약간의 변형.

편집하다:

죄송합니다. 설명과 예를 포함시켜야했습니다. 그만큼 %q 깃발 원인 printf 다른 명령에서 재사용 할 수 있도록 문자열에 탈출을 추가하려면. 그것의 출력 printf 이렇게 보일 것입니다 (단일 따옴표가 탈출됩니다) :

\'include_path=/path/to/dir\'

이 명령은 몇 가지 추가 탈출을 보여줍니다.

$ printf "%q" "string ';\ text"
string\ \'\;\\\ text

이건 어때?

$PHP_COMMAND ' -r echo get_include_path();' 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top