Когда вы используете причудливый стиль "|-"
, вы не указываете команду оболочки для запуска, а скорее указывает список аргументов, передаваемых в системный вызов execvp (2).
open(PIPE2,"|/bin/echod 'sometxt'") || die "Pipe2 cannot open: $!";
print PIPE2 "echoed 2\n";
close(PIPE2) || die "Pipe2 cannot close: $!";
против
open(PIPE3,"|-","/bin/echod", "sometxt") || die "Pipe3 cannot open: $!";
print PIPE3 "echoed 3\n";
close(PIPE3) || die "Pipe3 cannot close: $!";
Вторая форма используется только в том случае, если вы не хотите, чтобы оболочка расширяла символы подстановки, интерпретировала символы канала и символы перенаправления и т. Д., Когда вы передавали переменные неизвестного содержимого.
Первая форма предназначена для того, когда вы делаете хотите, чтобы это произошло, или когда в команде есть постоянные строки или строки известного содержимого. Я практически всегда использую первую форму, оставляя вторую для сложных ситуаций, таких как
open(GREPPER, "grep $expr @files |")
потому что это неблагодарная и довольно невозможная работа, пытаясь найти правильную цитату на $expr
.