문제
선이 포함 된 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();'