说我有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并想知道为什么我会使用它。我可以使用以下命令执行 bash 脚本:
bash foo.sh
Run Code Online (Sandbox Code Playgroud)
或者
./foo.sh
Run Code Online (Sandbox Code Playgroud)
(在 foo.sh 中有一条 shebang 行)
每种方法的优缺点是什么,我应该默认使用哪一种?
我有一个小的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 手册:
3.7.2 命令查找与执行
将命令拆分为单词后,如果生成简单命令和可选参数列表,则将执行以下操作。
...
如果该名称既不是 shell 函数也不是内置函数,并且不包含斜杠,Bash 将搜索 $PATH 的每个元素以查找包含该名称的可执行文件的目录。
如果搜索成功,或者命令名称包含一个或多个斜杠,则 shell 会在单独的执行环境中执行指定的程序。参数 0 设置为给定的名称,命令的其余参数设置为提供的参数(如果有)。
如果由于文件不是可执行格式且文件不是目录而执行失败,则假定它是 shell 脚本,并且shell 按照第 39 页第 3.8 节 [Shell 脚本] 中所述执行它。
假设 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?为什么“ …
我在 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 …
我试图弄清楚 shebang 的语义到底是什么。
我可以写一个这样的脚本:
#!/usr/bin/env bash
if [ -z "$FOO" ]
then
echo "No FOO"
else
echo "$FOO"
fi
Run Code Online (Sandbox Code Playgroud)
在我的环境中没有$FOO,并像 、 、 等一样运行它./foo.sh,bash 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 时,它只是复制命令,将脚本的路径附加到参数列表的末尾,然后执行它,但这种行为表明情况并非如此。
shebang 标头必须始终与解释器的安装目录匹配吗?如果是这样,那么为什么既#!/usr/bin/python和#!/usr/local/bin/python我的工作?
是否可以得出这样的结论:当使用 bash here-doc like 时bash << HEREDOC,那么总是无一例外,shebang 行 like#!/bin/bash -x是多余的?
如果我必须打赌,我敢打赌是的,它们将是多余的,只能使用我们来组织信息,就像一个标志说新用户“以下命令集最初是从传统脚本执行的,不要不要用双符号或其他类似方式将它们排成一行”。
我想知道专家怎么说 - 使用 here-doc 时,bash shebang 行真的是完全多余的吗?
我#!/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.sh或bash myscript.sh命令执行此脚本时- 脚本成功运行。
是的,没有安装ksh,安装这个是正确的。但我无法理解不同的行为./和bash或source
我在与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不更改代码的情况下使用它?
shebang ×10
bash ×4
python ×3
shell-script ×3
executable ×1
interpreter ×1
ksh ×1
linux ×1
python3 ×1
scripting ×1
shell ×1