echo不适用于PATH变量!

时间:2011-02-15 15:35:36

标签: perl

当我运行ls命令时,运行正常。但是echo $PATH并没有给我任何来自perl的输出。当我从shell提示符运行echo时,它会给我输出。你能解释一下这种行为吗?

#!usr/bin/perl

$\="\n";

$out = `ls`;
print $out;

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

6 个答案:

答案 0 :(得分:6)

反引号interpolate,如双引号,因此您需要转义$

$out=`echo \$PATH`;

答案 1 :(得分:6)

请注意,尽管问题的技术上正确答案是$插值,但您还应注意,您不应将Perl视为shell脚本,并通过反引号调用外部命令,而不是使用内置的Perl或为此目的设计的库函数:

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

这有几个显着的优点:

  • 速度(无需致电系统)
  • 可移植性
  • 更安全(没有shell攻击媒介)
  • 大多数内置插件都比您自己的系统调用实现更适合您的错误处理
  • 几乎总是更好,更清洁,更短,更容易阅读/维护代码

答案 2 :(得分:5)

$PATH是shell变量,从perl你应该使用它作为perl变量$ENV{PATH}

仍尝试阅读一些基本文档,例如perldoc perlintro。无需执行echo

答案 3 :(得分:1)

Perl在反引号中插入$ PATH作为Perl变量,并且你没有在脚本中的任何地方设置$ PATH,所以命令出现为

$out = `echo `

基本上是一个空操作。尝试

$out = `echo \$PATH`
相反,它会强制Perl忽略$并将其原封不动地传递给shell。

答案 4 :(得分:1)

您需要在$中转义$PATH,因为反引号运算符会插入任何变量。

$out=`echo \$PATH`;

您也可以将qx//与单引号一起使用。来自perldoc perlop

  

使用单引号作为分隔符   保护Perl的命令   传递它的双引号插值   转而使用shell:

     
      
  1. $ perl_info = qx(ps $$); #那是Perl的$$
  2.   
  3. $ shell_info = qx'ps $$'; #这是新shell的$$
  4.   

答案 5 :(得分:1)

其他人已经解释了原因 - 反引号内的变量是内插的,因此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} - 但是,您可能刚刚将其用作简单的简化演示案例。