эхо не работает для переменной PATH! - PullRequest
0 голосов
/ 15 февраля 2011

Когда я запускаю команду ls, все работает нормально. Но echo $PATH не дает мне никакого вывода из Perl. Когда я запускаю echo из командной строки, она выдаёт мне вывод. Можете ли вы объяснить это поведение?

#!usr/bin/perl

$\="\n";

$out = `ls`;
print $out;

$out=`echo $PATH`;
print $out;

Ответы [ 6 ]

6 голосов
/ 15 февраля 2011

Обратите внимание, что хотя технически правильным ответом на ваш вопрос является интерполяция $, вы также должны заметить, что вы не должны рассматривать Perl как сценарий оболочки и вызывать внешние команды с помощью обратных кавычек вместо использования встроенного Perl или библиотеки функции, предназначенные для этой цели:

$out = join("\n", glob("*")); # same as `ls`
$out = $ENV{PATH}; # same as `echo $PATH`

Это имеет несколько существенных преимуществ:

  • скорость (без вызова системы)
  • Портативность
  • Больше безопасности (без атаки с использованием оболочки)
  • Большинство встроенных модулей обеспечивают правильную обработку ошибок для вас лучше, чем ваша собственная реализация системных вызовов
  • Почти всегда лучше, чище, короче и легче читать / поддерживать код
6 голосов
/ 15 февраля 2011

Backticks интерполируют как двойные кавычки, поэтому вам нужно экранировать $.

$out=`echo \$PATH`;
5 голосов
/ 15 февраля 2011

$PATH - это переменная оболочки, из perl вы должны использовать ее как переменную perl $ENV{PATH}

Все еще попробуйте прочитать некоторые базовые документы, такие как perldoc perlintro.Нет необходимости выполнять echo вообще.

1 голос
/ 15 февраля 2011

Другие уже объяснили причину - переменные внутри обратных кавычек интерполируются, так что ваша echo $PATH фактически становится echo, поскольку не объявлена ​​$PATH переменная.

Однако всегда ставьте use strict; в начале каждого написанного вами Perl-скрипта.

Если бы вы сделали это, Perl сказал бы вам, что происходит, например:

Global symbol "$PATH" requires explicit package name at myscript.pl line 9

Чтобы переменные не былиинтерполировать, либо избегать их (например, \$PATH), либо, если быть более точным, использовать, например, qx'echo $PATH'.

Также, как уже отмечали другие, вызов echo $PATH не имеет смысла в реальном мире;если вы пытаетесь получить содержимое переменной окружения PATH, просто используйте $ENV{PATH} - однако, вы, возможно, только что использовали его как простой сокращенный демонстрационный случай.

1 голос
/ 15 февраля 2011

Вам нужно экранировать $ в $PATH, потому что оператор обратных ссылок интерполирует любые переменные.

$out=`echo \$PATH`;

Вы также можете использовать qx// с одинарными кавычками. От perldoc perlop :

Использование одинарных кавычек в качестве разделителя защищает команду от Perl's двойная кавычка, передавая ее вместо этого:

  1. $ perl_info = qx (ps $$); # это Perl's $$
  2. $ shell_info = qx'ps $$ '; # это новая оболочка $$
1 голос
/ 15 февраля 2011

Perl интерполирует $ PATH в обратных тегах как переменную Perl, и вы нигде не указали $ PATH в своем скрипте, поэтому команда выглядит как

$out = `echo `

, который в основном ноль. Попробуйте

$out = `echo \$PATH`

вместо этого, что заставит Perl игнорировать $ и передать его нетронутым в оболочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...