是否可以保证/ usr / bin / env将存在?


8

我经常会看到脚本以shebang行开头,该行#!/usr/bin/env interpreter_name用于任何解释器,其基本原理是不同的系统可能具有它们需要的解释器才能在不同位置运行。例如,如果我假设python已安装,/usr/bin/python则由于/opt/python某种原因决定安装它的某些用户将无法轻松使用它。

但是显而易见的问题是,是否env可以在/usr/bin/env(或就此而论的任何特定地点)安装任何保证,或者可以说这仅仅是“解决问题”的一种情况?

这个与问题稍微相关的问题有一条评论,说这是一个坏主意,最好将其与解释器的实际路径一起安装并引用单个unix规范,但并不能真正解决该问题。

Answers:


6

不,env不保证位于中/usr/bin,如您可以在shebang机制历史中阅读的“ env实用程序”部分中所示:

但是,env(1)的位置可能有所不同。Free,Net,OpenBSD和某些Linux发行版(例如Debian)仅与/ usr / bin / env一起提供。另一方面,至少在SCO OpenServer 5.0.6和Cray Unicos 9.0.2上只有/ bin / env(尽管后者仅具有历史意义)。在其他Linux发行版(Redhat)上,它位于/ bin中,/ usr / bin /包含指向它的符号链接。

由于env搜索的灵活性,它不能完全解决问题$PATH。如果你碰巧得到了一些脚本,使用不同的位置env,从你的,你需要知道在哪里你的env生活,而不是也是在perlpython和其他解释可能安装。

而且,/opt/python/3.3.2/bin/python3.3如果这是python3.3PATH中的第一个可执行文件,则无需进行硬编码。您可以依靠env它来查找,因此如果升级为使用/opt/python/3.3.3/bin/python3.3,则不必更新每个脚本。您的脚本标头保持不变:

#! /usr/bin/env python3.3

啊哈 谢谢。我找不到任何相关信息。当我说“移动”这个问题时,我的意思是不必寻找其他东西,而python perl现在您只需要查找env问题,同样的问题,但是目标却不同。似乎env更容易找到,而且用途也明显更多,因此它仍然非常有利。哪一个完美地回答了我的问题。谢谢!
scott_fakename 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.