- В чем разница между ver2 и ver3?
В каких аргументах вы передаете top
.Я не знаю версию top
, которая будет переключаться без черточек, как в некоторых версиях ps
, поэтому вам следует использовать версию 3.
- Есть ли причина, по которой я должен использоватьver2 и ver3, а не ver1?
Если вы передадите одну строку в system
, она будет запускаться через вашу оболочку.Это означает, что это будет интерпретироваться как оболочка.Любые случайные пробелы или метасимволы оболочки (кавычки, знаки доллара и т. Д.) В аргументах будут интерпретированы и, возможно, испортят ситуацию.Это также потенциальная дыра в безопасности.
Например, если $pid
было бы похоже на '10; echo pwnd; echo '
, то вы бы запустили top -H -p 10
, затем echo pwnd
, затем echo -n1
.
Такдля обеспечения безопасности и защиты, если вам не требуется обработка оболочки (см. ниже), вы должны передать системе список.
- Существуют ли эквиваленты ver2 и ver3, которые допускают каналы?
Нет, обвязка и перенаправление выполняются оболочкой.Вы должны использовать что-то, кроме system
.Вы можете сделать это с open
, но это задница.Самый простой способ - использовать IPC :: Run .
use IPC::Run;
my $out;
run ["echo", "foo\nbar\nbaz"], "|",
["grep", "ba"], "|",
["wc", "-l"],
\$out;
print $out; # 2
Но на самом деле, если вы просто копируете и считаете несколько строк, используйте Perl.
my $out;
run ["echo", "foo\nbar\nbaz"], '>', \$out;
my $count = grep { /ba/ } split /\n/, $out;
print $count;