2013-07-02 2 views
0

PHP를 사용하여 디렉토리를 인수로 취하는 쉘 명령을 실행하고 싶습니다. 문제는이 디렉토리 이름에 작은 따옴표와 공백이 모두 포함되어 있다는 것입니다. 셸에서 디렉토리가 "나는 디렉토리"라고하면 다음과 같이됩니다 :
ls I\'m\ a \ directory공백을 포함하는 인수가있는 PHP exec()

그러나 PHP를 통해 호출 할 때이 작업을 수행 할 수 없습니다. 나는
exec('ls I\'m\ a\ directory')
과 많은 변형을 시도했지만 그 중 아무 것도 작동하지 않는 것 같습니다. 어떤 제안? 미리 감사드립니다!

+0

작은 따옴표 대신 큰 따옴표를 사용하십시오. – Zzz

+0

여전히 작동하지 않습니다 : ( –

+0

[PHP exec() 및 공백이있는 경로] 중복 될 수 있습니다. (http://stackoverflow.com/questions/5489613/php-exec-and-spaces-in-paths) –

답변

1

이 시도 :

passthru('ls "I\'m a directory"'); 
,691 그래서 당신이 정말로 원하는 것은이 중 하나입니다

ls I'm\ a\ directory 
ls I\'m\ a\ directory 
ls I\'m\ a\ directory 
ls I\\'m\ a\ directory 

:에

echo 'ls I\'m\ a\ directory'; 
echo "\n"; 
echo "ls I\'m\ a\ directory"; //Note double quotes 
echo "\n"; 
echo 'ls I\\\'m\\ a\\ directory'; 
echo "\n"; 
echo "ls I\\\'m\\ a\\ directory"; //Note double quotes 

결과 :

는 이러한 비교

exec()는 출력 결과의 마지막 줄을 반환합니다. 이는 예상 한 것과 다를 수 있습니다. 이에 비교 :

exec('ls "I\'m a directory"', $outvar); 
print_r($outvar); 

을 내가 모두가 잘 매뉴얼을 읽고 생각하지만, 여기에 그냥 경우입니다 : FreeBSD의에 http://us1.php.net/manual/en/function.exec.php

예 개념 증명 세션 :

501:~$ mkdir "I'm a directory" 
502:~$ ls -lrt 
drwxr-xr-x 2 cxj cxj  512 Jul 2 19:32 I'm a directory 
drwxr-xr-x 33 cxj cxj  2048 Jul 2 19:32 . 
503:~$ cd I\'m\ a\ directory/ 
504:~/I'm a directory$ touch foo bar baz 
505:~/I'm a directory$ cd .. 
506:~$ cat - > test.php 
<?php passthru('ls "I\'m a directory"'); ?> 
507:~$ cat test.php 
<?php passthru('ls "I\'m a directory"'); ?> 
508:~$ php test.php 
bar 
baz 
foo 
+0

시도 할 것이다, 이 문제가 의심 스럽다. echo exec()는 출력의 마지막 줄만 가져 오지만 비워 두어서는 안된다. 예를 들어, exec ('ls ~')는 나에게 하나의 파일 이름을 준다. –

+0

아니, 아직 출력이 나오지 않습니다. –

+0

시스템이 무엇인가요? Mac OSX 및 FreeBSD에서 제대로 작동합니다. – CXJ

1

문자열로 인해 먹지 않도록 올바르게 슬래시를 두 번 이스케이프 처리해야합니다.

\'은 먹어서 단지 '으로 명령 줄로 전달됩니다.

exec('ls I\\\'m\ a\ directory') 
exec("ls I\'m\ a\ directory") 
+0

Still doesn 작동하지 않습니다 : ( –

+0

정의 "작동하지 않습니다" –

+0

마찬가지로, 그것은 아무것도 출력하지 않습니다. 게시하기 전에 두 제안을 시도했습니다. 코드 정상적인 이름을 가진 디렉터리에 대한 작동합니다. –