Кажется, это то же самое, что и 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 решает не принимать никаких решений относительно того, что на самом деле может означать данное выражение.
Надеюсь, это объясняет механику.