Как заставить функцию Perl qx
выполняться с моей переменной $opt
?
До (работает):
my @df_output = qx (df -k /tmp);
Я хочу использовать -k
, -g
или -H
:
my @df_output = qx (df -$opt /tmp);
Как заставить функцию Perl qx
выполняться с моей переменной $opt
?
До (работает):
my @df_output = qx (df -k /tmp);
Я хочу использовать -k
, -g
или -H
:
my @df_output = qx (df -$opt /tmp);
То, что у вас есть, должно работать, но: никогда не используйте qx
. Это древнее и опасное; все, что вы ему передаете, проходит через оболочку, поэтому очень легко быть уязвимым для внедрения оболочки или столкнуться с неожиданностями, если /bin/sh
не совсем то, что вы ожидали.
Используйте форму open()
с несколькими аргументами, которая полностью обходит оболочку.
open my $fh, '-|', 'df', "-$opt", '/tmp' or die "Can't open pipe: $!";
my @lines = <$fh>; # or read in a loop, which is more likely what you want
close $fh or die "Can't close pipe: $!";
system
возвращает статус выхода, а не стандартный вывод процесса. Но он также поддерживает безопасную форму с несколькими аргументами, да.
- person Eevee; 17.06.2011
попробуйте использовать обратную косую черту \$opt
, это работает.
Use of uninitialized value in concatenation (.) or string at ./tst.pl
. Такжеdf: -: No such file or directory
. Интересно, я все еще получаю рабочий вывод, но с этими сообщениями. - person jdamae   schedule 17.06.2011$opt
не определено. - person Eevee   schedule 17.06.2011df
, это глупая идея. - person daxim   schedule 17.06.2011