在Perl中为新命令设置PATH变量会显示错误:找不到命令

时间:2015-03-30 04:08:33

标签: path command environment-variables

我正在编写一个Perl脚本来添加一个新命令。 为此:

  1. 我使用了set env PATH命令并添加了包含脚本的目录(名称与命令名称相同)。

  2. 我还让脚本可执行。

  3. 我试过这两件事:

    1. 明确地:在使用setenv PATH $PATH":home/user/trial_dir"
    2. 的终端上

      当我输入命令名称时,它会显示:Command not found

      1. 脚本:export PATH = "home/user/trial_dir".":".$PATH;
      2. 这里说:

        Can't locate object method "export" via package "PATH"
        (perhaps you forgot to load "PATH"?)
        

1 个答案:

答案 0 :(得分:0)

你的贝壳是什么? setenv是csh语法,但错误消息看起来像Bash错误消息。无论如何,cshtcsh的正确语法是

setenv PATH $PATH":/home/user/trial_dir"

请特别注意home之前添加的斜杠。 PATH中的相对路径通常没有意义。我猜这是你第一次尝试失败的原因。

此外,如果脚本文件具有DOS CRLF line terminators(特别是在shebang line上),则会产生相同的症状 - 即使debug: command not found消息为debug实际上找到了{1}}脚本,但找不到shebang行上的命令。 (您会注意到which debug表示tcsh在这种情况下实际找到了脚本。)

第二次尝试是错误的,因为(a)你不能在sh语法中分配空间,而(b)错误信息看起来像你以某种方式将此命令传递给Perl而不是shell(你是什么意思“脚本:”?)

Bash(或通常* sh除了csh)提示符的正确语法将是

export PATH="/home/user/trial_dir":$PATH

(我在/之前添加了一个前导home)但是因为你说你正在使用tcsh我只是提到完整性。这不是有效的Perl命令。

虽然这种方法没有任何问题,但通常的做法是将您的脚本(或符号链接)放在$HOME/bin中,只需一次,确保$HOME/bin在您的PATH中{1}}(这已经是某些Linux发行版的默认设置了。)

您添加的目录是否应该在上一个PATH之前或之后出现,这在很大程度上取决于品味。现代shell通常使用散列,因此只有在您第一次尝试使用它时才会查找该命令,之后,shell会记住它的找到位置。如果您经常输错命令,可能会尽量限制PATH。 :-)如果您的命令需要隐藏系统命令,请务必将新目录放在系统PATH前面。