编辑: 问题和答案是正确的,但我在这里所说的问题不是。维护者实际上拒绝使用它/usr/bin/env
作为解决方案,而是重新创建了该脚本sh
,这样做破坏了其他用户的安装。因此,env
用于查找bash
不是POSIX,而是默认“足够”以被视为标准。
我在nixos(特别是haskell堆栈)上安装软件时遇到一些错误,并且在Internet上进行了一些挖掘之后,我发现了一些人在安装软件的特定路径方面遇到问题的示例。在此示例中,维护人员将修改恢复为/usr/bin/env
查找bash的解决方案,因为它破坏了其他用户的安装。
因此,env
在没有通知安装绝对路径的情况下(依赖系统搜索路径)引用shebang可能被认为是错误的吗?
我的意思是可以使用
#!env bash
代替
#!/usr/bin/env bash
如果env
不是在所有系统上默认安装的绝对路径都是默认的?
env
存在于/usr/bin
几乎所有的类Unix仍处于21世纪的现存系统。我知道的两个例外是SCO OpenServer(仍为一些非常老的服务器提供支持)和NextSTEP(没有太多支持的硬件,这些硬件还没有消失)。为了便于携带,请使用#!/usr/bin/env
。其他任何东西都不那么可移植(除非#!/bin/sh
,它有自己的问题,并且仅当您计划在SCO上运行脚本时才有用)。
POSIX和单一Unix没有定义/usr/bin/env
,或者/bin/sh
,或者任何绝对路径以外/
,/tmp
以及在几个条目/dev
。/usr/bin/env
它不是正式的Unix标准,但实际上是一个事实上的标准。
#!env
是完全没用的。Shebang查找不使用PATH
变量,而是由内核完成的。(如果它执行了PATH查找,那么您不妨#!bash
直接编写)
#!/usr/bin/env bash
对于bash脚本来说是完美的选择,我质疑拒绝更改的维护者的智慧#!/bin/bash
。看起来维护者被请求打扰了,然后并没有非常认真地对待它。更改为使用标准sh而不是bash更好地实现了可移植性,但显然没有用(脚本可能还有一个非标准的构造)。如果无法将脚本转换为可在其他Shell中使用#!/usr/bin/env bash
,则应仍将脚本更改为使用而不是#!/bin/bash
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句