와의 차이점을 이해하기 위해 고심 shell_exec()
하고 있습니다 exec()
...
exec()
서버 측 명령을 실행 하는 데 항상 사용 shell_exec()
했습니까?
가 shell_exec()
단지 속기 exec()
? 더 적은 매개 변수를 가진 동일한 것으로 보입니다.
와의 차이점을 이해하기 위해 고심 shell_exec()
하고 있습니다 exec()
...
exec()
서버 측 명령을 실행 하는 데 항상 사용 shell_exec()
했습니까?
가 shell_exec()
단지 속기 exec()
? 더 적은 매개 변수를 가진 동일한 것으로 보입니다.
답변:
shell_exec
모든 출력 스트림을 문자열로 반환합니다. exec
기본적으로 출력의 마지막 줄을 반환하지만 모든 출력을 두 번째 매개 변수로 지정된 배열로 제공 할 수 있습니다.
보다
exec()
[할] 수있는 모든 shell_exec()
[캔,] 더 :) "
차이점은 다음과 같습니다. 마지막 줄 바꿈에 유의하십시오.
> shell_exec('date')
string(29) "Wed Mar 6 14:18:08 PST 2013\n"
> exec('date')
string(28) "Wed Mar 6 14:18:12 PST 2013"
> shell_exec('whoami')
string(9) "mark\n"
> exec('whoami')
string(8) "mark"
> shell_exec('ifconfig')
string(1244) "eth0 Link encap:Ethernet HWaddr 10:bf:44:44:22:33 \n inet addr:192.168.0.90 Bcast:192.168.0.255 Mask:255.255.255.0\n inet6 addr: fe80::12bf:ffff:eeee:2222/64 Scope:Link\n UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1\n RX packets:16264200 errors:0 dropped:1 overruns:0 frame:0\n TX packets:7205647 errors:0 dropped:0 overruns:0 carrier:0\n collisions:0 txqueuelen:1000 \n RX bytes:13151177627 (13.1 GB) TX bytes:2779457335 (2.7 GB)\n"...
> exec('ifconfig')
string(0) ""
백틱 연산자의 사용법 은과 동일합니다 shell_exec()
.
업데이트 : 마지막으로 설명해야합니다. 몇 년 후이 답변을 보면 왜 그것이 비 었는지 모르겠습니다! Daniel은 위에서 설명했습니다 exec
. 마지막 줄만 반환 하기 때문에 ifconfig
마지막 줄은 비어 있습니다.
2>&1
리눅스 머신이라면 STDERR을 STDOUT으로 리다이렉션하기 위해 커맨드의 끝에 추가해보십시오 .
shell_exec
-쉘을 통해 명령을 실행 하고 완전한 출력을 문자열로 반환
exec
-외부 프로그램을 실행하십시오.
차이점은 shell_exec
출력을 반환 값으로 얻는다 는 것입니다 .
exec
출력의 마지막 행 을 리턴 한다는 점에 유의해야 합니다. 원하는 경우, 전체 출력을 캡처하기 위해 두 번째 매개 변수로 배열을 전달하고 오류 검사에 사용될 수있는 쉘 명령의 리턴 값을 캡처하기 위해 세 번째 매개 변수로 정수를 선택적으로 전달할 수 있습니다. 가장 큰 단점 shell_exec
은 명령이 실패하거나 출력을 생성하지 않으면 null을 반환하므로 반환 값을 오류 검사에 안정적으로 사용할 수 없다는 것입니다.
여기서 다루지 않은 몇 가지 차이점 :
비교:
exec('ls', $out);
var_dump($out);
// Look an array
$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it
반대로, 명령의 출력이 xml 또는 json 인 경우 입력을 다른 형식으로 후 처리해야하므로 각 행을 배열의 일부로 갖는 것은 원하는 것이 아닙니다.이 경우 shell_exec를 사용하십시오 .
shell_exec는 * nix에 사용 된 백틱 연산자의 별명임을 지적 할 가치가 있습니다.
$out = `ls`;
var_dump($out);
exec는 실행 된 명령의 리턴 코드를 제공하는 추가 매개 변수도 지원합니다.
exec('ls', $out, $status);
if (0 === $status) {
var_dump($out);
} else {
echo "Command failed with status: $status";
}
shell_exec 매뉴얼 페이지에서 언급 한 것처럼 실제로 실행중인 명령의 리턴 코드가 필요한 경우 exec를 사용할 수 밖에 없습니다.
exec
명령의 리턴 코드 ( &$return_var
매개 변수 를 통해 ) 를 가져올 수 있지만 명령 shell_exec
을 얻는 방법은 없습니다.
date
,whoami
,ifconfig
,netstat
.