system ( "dialog --menu Customize 10 70 50 "
. "'Flush rules' 'Clear all the rules' "
. "'Show rules' 'Shows the current rules' "
. "'more options' '........' 2> /tmp/tmp.txt ");
Черт, tadmc быстро. Да, используйте команду конкатенации .
.
Я бы порекомендовал вам создать свою команду в отдельной строке и затем выполнить ее. Я также рекомендую использовать команду qq
для цитирования. Таким образом, вам не нужно беспокоиться об одинарных или двойных кавычках:
my $command = qq(dialog --menu Customize 10 70 50 )
. qq("Flush rules" 'Clear all the rules' )
. qq('Show rules' 'Shows the current rules' )
. qq'more options' '........' 2> /tmp/temp.$$ );
my $error = system $command;
Использование qq
позволяет вам не беспокоиться о том, нужно ли мне использовать двойные кавычки для интерполяции переменных или одинарных кавычек или необходимость экранировать кавычки. Например, мне удалось смешать двойные и одинарные кавычки, и я могу использовать переменные Perl, не беспокоясь о том, нужно ли мне переходить с одинарных на двойные кавычки. Например, я использую /tmp/temp.$$
. $$
- это идентификатор процесса, поэтому, если эта команда выполняется дважды, используются два разных временных файла.
Создав отдельную переменную для моей команды, я теперь могу использовать ее позже - например, если в моей системной команде произошла ошибка.
Кстати, вы всегда должны проверять возвращение вашей команды system
. Вероятно, есть хороший шанс, что если по какой-то причине вы не сможете выполнить системную команду, вы, вероятно, захотите выполнить ошибку или хотя бы заметить проблему.
Одна из проблем заключается в том, что вывод системной команды противоположен большинству функций Perl. В большинстве функций Perl возврат нуля указывает на сбой, а возврат ненулевого указывает на успех. Однако функция system
является полной противоположностью. Ноль означает успех, не ноль означает неудачу.
Это может привести к странным конструкциям:
if (system $command) {
die qq(Can't execute command "$command"\n);
};
Похоже, я говорю, что, если моя системная команда выполнена успешно, я должен умереть, но на самом деле это означает то же, что и это:
my $error = system $command;
if ($error) {
die qq(Can't execute command "$command"\n);
}
Это синтаксически имеет гораздо больше смысла.