open my $fh_echo, "-|", "$sshstr \"$str\""
과 같은 일을하는 것 같습니다. 일이 성공적으로 열릴 때
exec qq[$sexec qq[$sshstr "$str"] unless open my $fh_echo, '-|'
출력은 정말 $ fh_echo이 방식에 의한 개방의 가장 오른쪽 인수에 실행 파일의 출력()와 핸들되고, $ fh_echo에로드되지 않은 : 그것은으로 deparses 파이프 라인의 파이프 라인에 대한 자세한 내용은 wikipedia page을 확인하십시오. 그러나 주어진 예제는 아무 것도 열지 않는다는 것을 지적해야합니다. 제공 한 예제의 오른쪽에 명령이 없으므로 open()은 항상 실패를 나타내는 true가 아닌 값을 반환하고 표현식의 오른쪽은 항상 실행됩니다. http://ideone.com/wupJ8
더 자세한 내용은 성공하려면 open my $f, "-|", "echo hi"
을 사용하는 것이 좋습니다.
pipe my $fh_echo, my $childout;
if (fork == 0) {
close STDOUT;
open STDOUT, ">>&", $childout;
exec "echo hi";
}
이 먼저 포크 파이프를 생성하고 :이 명령을 주면 다음이 대략 동등하게, 파이프의 우측 인 것으로 자식 프로세스에 stdin을 재정의한다. 자식 프로세스에서 stdout은 파이프의 쓰기 측으로 다시 정의됩니다. 그러면 현재 프로세스를 주어진 프로세스로 대체하는 exec
이 호출됩니다 (자세한 내용은 exec (2) 참조). 그 시점부터 stdout이 파이프의 쓰기 가능한면으로 재정의 되었기 때문에 stdout에 대한 모든 출력은 실제로 대상이 이전에 있던 파이프가 아닌 파이프에 실제로 기록됩니다.
또한 정규화 된 실행 파일 경로가 아니므로 exec "echo hi"결함을 쉘에 더 자세히 설명합니다. 즉, perl은 주어진 표현이 실제로 무엇을 의미하는지 결정하지 않기로 결정했기 때문에 실제로는 perl에 의해 exec "/bin/sh", "echo hi"
으로 읽혀집니다.
희망 사항은 그 역학을 설명합니다.
오오 기본적으로 자식 프로세스의 출력을 가져옵니다.이 출력은 exec이며 $ fh_echo를 해당 출력의 핸들로 설정합니다. 이것은 버퍼링 된 프로세스입니까? 아니면 동기인가? –
이것은 버퍼 처리 된 핸들이므로'$ |'를 설정해야합니다. –
open()은 오른쪽을 제공해야하기 때문에이 예제에서 항상 실패합니다. 그래서 위의 코드는 항상 exec (qq [$ sshstr "$ str"])를 호출하여 종료된다는 것을 의미합니다. –