当我使用shebang#!/usr/bin/env python运行脚本时,系统如何知道python使用哪个?如果我python在环境变量中寻找 bin 路径,我什么也找不到。
env | grep -i python
Run Code Online (Sandbox Code Playgroud) 在我见过的大多数 shell 脚本中(除了我自己没有写的脚本),我注意到 shebang 设置为#!/bin/sh. 这在旧脚本上并没有让我感到惊讶,但在相当新的脚本上也是如此。
是否有任何理由宁愿/bin/sh过/bin/bash,因为bash几乎是无处不在的,而且往往默认情况下,许多Linux和BSD的机器回去了十多年?
在 shell 脚本中,在 shebang( #!) 行指定语言解释器。据我所知,建议使用,#!/usr/bin/env bash因为env它总是位于/usr/bin目录中,而位置bash可能因系统而异。但是,如果bash直接使用/bin/bash或通过env实用程序启动,是否有任何技术差异?另外,如果我没有为 指定任何变量env,bash则在未修改的环境中启动,我是否正确?
是否有可能有一个shebang,而不是指定解释器的路径,而是具有解释器的名称,并让shell通过$PATH找到它?
如果没有,有什么原因吗?
我遇到了一个有趣的情况,我有一个 Python 脚本,理论上可以由具有各种环境(和路径)和各种 Linux 系统的各种用户运行。我希望这个脚本尽可能多地在没有人为限制的情况下执行。以下是一些已知的设置:
我想在所有这三个上运行相同的可执行 python 脚本。如果它首先尝试使用 /usr/bin/python2.7 会很好,如果它存在,然后回退到 /usr/bin/python2.6,然后回退到 /usr/bin/python2.5,然后如果这些都不存在,就会出错。不过,我并不太喜欢使用最新的 2.x 版本,只要它能够找到正确的解释器之一(如果存在)。
我的第一个倾向是将 shebang 行从:
#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)
到
#!/usr/bin/python2.[5-7]
Run Code Online (Sandbox Code Playgroud)
因为这在 bash 中工作正常。但是运行脚本会给出:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)
好的,所以我尝试以下操作,这也适用于 bash:
#!/bin/bash -c /usr/bin/python2.[5-7]
Run Code Online (Sandbox Code Playgroud)
但同样,这失败了:
/bin/bash: - : invalid option
Run Code Online (Sandbox Code Playgroud)
好的,显然我可以编写一个单独的 shell 脚本来找到正确的解释器并使用它找到的任何解释器运行 python 脚本。我只是觉得分发两个文件很麻烦,只要它在安装了最新的 python 2 解释器的情况下运行就足够了。要求人们显式调用解释器(例如,$ python2.5 …
我尝试了以下但它似乎不起作用:
$ cat script.sh
#!/bin/env -i /bin/sh
/bin/env
$ script.sh
/bin/env: invalid option -- ' '
Try `/bin/env --help' for more information.
Run Code Online (Sandbox Code Playgroud) 哪一个更好:
#!/usr/bin/env sh#!/bin/sh我曾经认为第一个是最好的,无论如何我发现在一些基于 Linux 的系统(如 Android)上缺少路径名,所以现在我认为拥有“可移植”shell 脚本的唯一方法是不包括任何标题...
gawk 通常是在 /bin 还是 /usr/bin 中?我会去,#!/usr/bin/env gawk但后来我不能使用参数。现在我正在使用#!/bin/gawk -f. 脚本很长,包含很多单引号,并与标准输入一起使用。
GNU Awk 手册有部分 1.1.4 Executable awk Programs在它的示例中使用 #!/bin/awk 但接着说:
请注意,在许多系统上
awk可能会发现 in/usr/bin而不是 in/bin。买者自负。
大多数人做什么?我读过sed 应该在 /bin 中标准化,而 perl 应该在 /usr/bin 中标准化(与 sed 链接相同的页面,但他们不会让我为这篇文章制作第三个链接)。awk/gawk 怎么样?有谁知道哪个更常见或更受欢迎?
我有一个 shell 脚本,我想在其中添加一个 shebang。给定一个定义如下的变量:
SHEBANG="#!/bin/sh"
Run Code Online (Sandbox Code Playgroud)
我的问题是我是否可以在另一个脚本中使用该变量,如下所示:
$SHEBANG
# other stuff...
Run Code Online (Sandbox Code Playgroud) 我最近注意到许多脚本/usr/bin/env在他们的shebang中使用。我已经看到主要使用Bash和Python,但迄今为止从未与POSIX sh ( ash, dash,... )结合使用。
我想知道为什么,如果我的本意是高度可移植的POSIX shell 脚本可能会从这种env方法中受益?
关于是否使用:是否存在普遍共识:
标准:
#!/bin/sh
Run Code Online (Sandbox Code Playgroud)环境:
#!/usr/bin/env sh
Run Code Online (Sandbox Code Playgroud)让我足够强调这一点:
我从来没有见过这个sh。