标签: shebang

执行脚本时如何将参数传递给shebang解释器?

说我有my.script这样的

#!/bin/bash

blah
blah
Run Code Online (Sandbox Code Playgroud)

并且 bash 解释器接受一个--verbose参数。

如何执行 my.script 传递 --verbose 到 bash?

我知道我可以在命令行上执行 bash --verbose my.script ,但我需要能够my.script直接运行。

编辑:

好吧,也许我应该描述一下我的确切例子。我正在使用 grunt.js 构建系统,其 cli 是一个带有 #! 到节点。现在,grunt 运行插件,我使用的一个这样的插件需要在节点上启用某个标志。grunt cli 脚本不会这样做,我不想更改它。

shebang

2
推荐指数
1
解决办法
2059
查看次数

使用shebang行执行脚本更好吗?

我正在查找shebang并想知道为什么我会使用它。我可以使用以下命令执行 bash 脚本:

bash foo.sh
Run Code Online (Sandbox Code Playgroud)

或者

./foo.sh
Run Code Online (Sandbox Code Playgroud)

(在 foo.sh 中有一条 shebang 行)

每种方法的优缺点是什么,我应该默认使用哪一种?

scripting shebang

2
推荐指数
1
解决办法
1415
查看次数

避免将环境变量传递给 python 脚本

我有一个小的python脚本

#!/usr/bin/env python3

import some_python3_module

def main():
    # do stuff

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

并且无法使用 Python3 运行此脚本,因为 ROS 将该PYTHONPATH变量设置为某些与 2.7.版本相关的位置,这意味着 Python 3 在其dist-packages目录中找不到任何模块。我想覆盖这种行为而不必修改外部环境。也就是说,我希望unset PYTHONPATH,但仅限于这个脚本,最好是从它内部,这样shebang仍然可以工作。这可能吗?

不确定这是否更适合 superuser.com

bash python environment-variables shebang python3

2
推荐指数
1
解决办法
1413
查看次数

bash 脚本如何通过其文件名作为命令名执行,带或不带 shebang?

来自 bash 手册:

3.7.2 命令查找与执行

将命令拆分为单词后,如果生成简单命令和可选参数列表,则将执行以下操作。

...

  1. 如果该名称既不是 shell 函数也不是内置函数,并且不包含斜杠,Bash 将搜索 $PATH 的每个元素以查找包含该名称的可执行文件的目录。

  2. 如果搜索成功,或者命令名称包含一个或多个斜杠,则 shell 会在单独的执行环境中执行指定的程序。参数 0 设置为给定的名称,命令的其余参数设置为提供的参数(如果有)。

  3. 如果由于文件不是可执行格式且文件不是目录而执行失败,则假定它是 shell 脚本,并且shell 按照第 39 页第 3.8 节 [Shell 脚本] 中所述执行它。

  1. 假设 bash 脚本myscript不包含 shebang。

    • 引用是否意味着如果脚本通过命令在 bash 中执行myscript,那么

      • bash 首先会假设它是一个 ELF 并调用execve()它,因为它是一个 bash 脚本而不是 ELF,所以execve()调用会失败,

      • bash 接下来会执行吗bash myscript

    • 与通过bash myscriptin bash 运行 bash 脚本相比,通过 in bash 运行脚本myscript还会直接调用execve()脚本失败吗?

    • 如果是,则myscript慢于bash myscript?为什么“ …

bash shell-script shebang

2
推荐指数
1
解决办法
2047
查看次数

/bin/env : 糟糕的解释器

我在 Linux Mint 19.03 上。

我有一个安装 shell 脚本文件,setup.sh. 当我跑./setup.sh

muyustan@mint:~/Downloads/quartusExtracted$ ./setup.sh 
bash: ./setup.sh: /bin/env: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

在的shebang setup.sh

#!/bin/env bash
Run Code Online (Sandbox Code Playgroud)

我对这些事情的理解非常狭窄,因为我对 Linux 世界还很陌生。

我知道,使用/bin/env bash而不是提供确切的bash路径类似于“在环境变量中搜索并尝试查找bash”。当我查看/bin目录时env,我看到没有这样的文件:

muyustan@mint:/usr/bin$ ll /bin | grep "env"
lrwxrwxrwx  1 root root       6 Mar 21 14:35 open -> openvt*
-rwxr-xr-x  1 root root   18872 Jan 22  2018 openvt*
Run Code Online (Sandbox Code Playgroud)

还,

muyustan@mint:~/Downloads/quartusExtracted$ which bash
/bin/bash
Run Code Online (Sandbox Code Playgroud)

因此,我认为更改setup.shto 中的 shebang …

bash environment-variables shebang

2
推荐指数
1
解决办法
4178
查看次数

#!/usr/bin/env 因 NAME=VALUE 而挂起

我试图弄清楚 shebang 的语义到底是什么。

我可以写一个这样的脚本:

#!/usr/bin/env bash

if [ -z "$FOO" ]
then
    echo "No FOO"
else
    echo "$FOO"
fi
Run Code Online (Sandbox Code Playgroud)

在我的环境中没有$FOO,并像 、 、 等一样运行它./foo.shbash foo.sh它将env bash foo.sh按预期打印“No FOO”。

我当然可以像这样运行它FOO=bar ./foo.sh并且它会打印bar

手册env页给出的调用如下:

env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
Run Code Online (Sandbox Code Playgroud)

我可以这样使用它:

$ env FOO=bar bash foo.sh
bar
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试在 shebang 中使用该语法:

env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
Run Code Online (Sandbox Code Playgroud)

然后./foo.sh无限期挂起并且不执行。

谁可以给我解释一下这个?我假设当遇到 shebang 时,它只是复制命令,将脚本的路径附加到参数列表的末尾,然后执行它,但这种行为表明情况并非如此。

shell environment-variables shebang

2
推荐指数
1
解决办法
283
查看次数

shebang 总是和解释器的安装目录一样吗?

shebang 标头必须始终与解释器的安装目录匹配吗?如果是这样,那么为什么既#!/usr/bin/python#!/usr/local/bin/python我的工作?

linux python executable shebang interpreter

1
推荐指数
2
解决办法
885
查看次数

Bash here-documents 和 shebang 行

是否可以得出这样的结论:当使用 bash here-doc like 时bash << HEREDOC,那么总是无一例外,shebang 行 like#!/bin/bash -x是多余的?

如果我必须打赌,我敢打赌是的,它们将是多余的,只能使用我们来组织信息,就像一个标志说新用户“以下命令集最初是从传统脚本执行的,不要不要用双符号或其他类似方式将它们排成一行”。

我想知道专家怎么说 - 使用 here-doc 时,bash shebang 行真的是完全多余的吗?

shell-script here-document shebang

1
推荐指数
1
解决办法
926
查看次数

/bin/ksh: 错误的解释器:没有那个文件或目录

#!/bin/ksh在第一行有脚本。当我尝试执行此脚本 (run ./myscript.sh) 时发生错误:

-bash: ./myscript.sh: /bin/ksh: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是当我通过source myscript.shbash myscript.sh命令执行此脚本时- 脚本成功运行。

是的,没有安装ksh,安装这个是正确的。但我无法理解不同的行为./bashsource

bash ksh shell-script shebang source-command

1
推荐指数
1
解决办法
1万
查看次数

为什么shebang的第二部分有优先权?

我在与python默认值不同的可执行文件下运行 python 脚本。

/usr/bin/mydir/mybins.

如果我跑,我得到:

$which python
/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

如果运行run.py

# cat run.py
#!/usr/bin/env /mydir/mybins/python

import os
import sys

print(u"Python executable: %s" % sys.executable)
print(u"From within Python PATH=%s" % os.environ[u"PATH"])
Run Code Online (Sandbox Code Playgroud)

我得到

# ./run.py
Python executable: /mydir/mybins/python
From within Python PATH=/usr/bin:... (and no /mydir/mybins)
Run Code Online (Sandbox Code Playgroud)

为什么?这是故意的吗?如何在/usr/bin/python不更改代码的情况下使用它?

python shebang

0
推荐指数
1
解决办法
114
查看次数