什么类型的shebang路径更可取?

Modified on: Thu, 14 Jun 2018 06:29:23 +0800

在脚本中,第一行应指定解释器的路径
但是在不同的服务器Linux,Unix或BSD上,这条路径可能会有所不同。

更可取的是什么?

#!/usr/bin/env bash 

#!/bin/bash

最佳答案

如果要使用安装在标准位置的给定解释器的系统安装版本,请使用直接路径。如果要在用户的$PATH中首先使用解释器的任何版本,请使用#!/usr/bin/env ...

env命令调用指定的命令,允许您设置或取消设置环境变量:

env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &

如果未指定任何环境变量或其他选项,则只会调用命名命令。 (以这种方式使用它可以说是一种黑客攻击。)

写作shebang的目的是

#!/usr/bin/env interp

是在interp中首先调用$PATH

这意味着在编写脚本时,您不必知道interp的确切位置(例如,如果它可以在/bin中,/usr/bin,或/usr/local/bin)。当然你必须知道env/usr/bin/env,但这似乎是相当普遍的。

优点是它可以调用用户的$PATH中首先出现的解释器版本。 缺点是它调用用户的$PATH中首先出现的解释器版本。

例如,假设我在我的主目录下安装了perl的个人版本,如$HOME/bin/perl,我有$HOME/bin。如果我运行一个shebang

的脚本

#!/usr/bin/env perl

然后它将使用我自己安装的perl可执行文件运行 - 这可能不是一件好事。该脚本的作者可能还没有使用我在一个月前从源代码构建的泛化边缘Perl进行测试。

对于像Perl或Bash这样的东西,它们可能安装在大多数系统的一致位置(分别是/usr/bin/perl/bin/bash) ,我将使用命令的直接路径。对于可以在不同系统上以不同方式安装的更加模糊的东西,我要么使用/usr/bin/env技巧,要么我会编写一个安装程序来调整shebang行,因为脚本是正在安装。 (我以前必须为我的Perl脚本执行此操作。)

更新:我在此答案中详细介绍了一下Unix&此问题 ; Linux网站。

作者:,community wiki,4 revs
Keith Thompson

相关问答

添加新评论