我在一台较旧的 Debian 6 机器上工作。它有一个旧版本的 Perl,这导致一些自检失败“需要 Test::More 版本 0.96”。我下载了最新的 Perl 5.22.1,从源代码构建它并将其放在/opt/perl/
。
我有一个使用 Perl 的脚本,它的序言是:
#!/usr/bin/env perl
但是,当我执行脚本时,它使用的是旧版 Perl,而不是新版 Perl。这是意料之中的,因为我/usr/bin/env
不了解 Perl(或者我不相信它了解)。
我如何知道env
Perl 是 中的一个/opt/perl/
,而不是 中的/usr/bin/
一个?如果可能的话,我希望它是一个机器配置(即,适用于所有人),而不是用户配置(即,仅适用于我)。
这是 的手册页env(1)
。内容不多,而且我认为它没有讨论为解释器注册程序的新版本。没有env(7)
(杂项) 或env(8)
(管理) 的手册页。
ENV(1) User Commands ENV(1)
NAME
env - run a program in a modified environment
SYNOPSIS
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
DESCRIPTION
Set each NAME to VALUE in the environment and run COMMAND.
-i, --ignore-environment
start with an empty environment
-0, --null
end each output line with 0 byte rather than newline
-u, --unset=NAME
remove variable from the environment
--help display this help and exit
--version
output version information and exit
A mere - implies -i. If no COMMAND, print the resulting environment.
AUTHOR
Written by Richard Mlynarik and David MacKenzie.
...
答案1
像贝壳一样,env
用途$PATH
查找简单命令名的可执行文件。(与 shell 不同,它不会首先尝试别名、函数和内置命令。)我手头没有 Debian,但在我的 Ubuntu 14.04(应该没什么不同)上,标准/打包perl
位于/usr/bin
,没有自定义的测试用户会获得$PATH
设置
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
加上默认.profile
检查是否$HOME/bin
存在,如果存在则将其添加到前面。
/usr/local/*
专门用于“特定于我的系统”覆盖和~username/bin
“仅限此用户”覆盖,因此其中任何一个中的符号链接都应该有效。或者,您可以在之前放置/opt/perl
(或者/opt/perl/bin
如果它是这样构造的)。$PATH
/usr/bin