Что именно делает эта строка, и как она это делает? открой мой $ fh_echo, '- |' или exec "$ sshstr \" $ str \ "" - PullRequest
4 голосов
/ 10 августа 2010

Вот эта строка в Perl:

open my $fh_echo, '-|' or exec "$sshstr \"$str\"";

В основном это исполняемый файл $ sshstr, и затем вывод каким-то образом переходит в $ fh_echo. Мне любопытно, какие механизмы стоят за этой операцией. Может кто-нибудь объяснить, что такое «- |» означает?

Кроме того, как это загружает вывод в $ fh_echo? Выводит ли он это понемногу или $ fh_echo - просто дескриптор вывода exec?

Ха-ха, я не могу даже гуглить это Потому - | не отображаются в результатах.

Ответы [ 2 ]

4 голосов
/ 10 августа 2010

См. Perlfork .Это открытый канал для разветвления.

По существу, |- передает данные по каналу разветвленному дочернему процессу, а -| читает (в рамках дочернего процесса) из родительского процесса.

От perldoc -f open :

Если вы открываете канал по команде '-', т. е. либо '| -', либо '- |'с формой open () с 2 аргументами (или 1 аргументом) выполняется неявный форк, и возвращаемое значение open - это pid дочернего элемента в родительском процессе и 0 в дочернем процессе.

В вашем примере вы открываете канал для чтения из дочернего процесса, затем разветвляетесь, затем в дочернем процессе, заменяя процесс на $sshstr.

2 голосов
/ 10 августа 2010

Кажется, это то же самое, что и open my $fh_echo, "-|", "$sshstr \"$str\"". Отклоняется как:

exec qq[$sexec qq[$sshstr "$str"] unless open my $fh_echo, '-|'

Выходные данные на самом деле не загружаются в $ fh_echo при успешном открытии, $ fh_echo становится дескриптором файла с выводом исполняемого файла в самом правом аргументе open () посредством конвейера. Подробнее о конвейерах можно узнать на странице википедии . Следует отметить, что приведенный вами пример ничего не открывает. Поскольку в правой части приведенного вами примера нет команды, open () всегда будет возвращать неверное значение, указывающее на ошибку, а правая часть выражения будет всегда выполняться. Смотри http://ideone.com/wupJ8

Чтобы получить более подробную информацию, если она будет успешной, мы будем использовать open my $f, "-|", "echo hi" в качестве лучшего примера. Что это делает, так это переопределяет stdin для дочернего процесса как правую часть канала, делая его примерно эквивалентным следующему:

pipe my $fh_echo, my $childout;

if (fork == 0) {
    close STDOUT; 
    open STDOUT, ">>&", $childout;

    exec "echo hi";
}

Это сначала создает трубу, а затем разветвляется. В дочернем процессе stdout переопределяется как сторона записи канала. Затем вызывается exec (см. Подробности в exec (2)), который заменяет текущий процесс заданным процессом. С этого момента, поскольку stdout был переопределен как сторона канала, доступная для записи, весь вывод в stdout будет фактически записывать в канал вместо того, что когда-либо было целью до этого.

Кроме того, для более подробной информации о дефектах exec "echo hi" в оболочке, поскольку это не полный путь к исполняемому файлу. То есть, на самом деле perl читается perl как exec "/bin/sh", "echo hi", поскольку perl решает не принимать никаких решений относительно того, что на самом деле может означать данное выражение.

Надеюсь, это объясняет механику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...