如果我写,
#!/bin/bash
echo "foo"
Run Code Online (Sandbox Code Playgroud)
或者
#!/bin/sh
echo "foo"
Run Code Online (Sandbox Code Playgroud)
两者产量相同。我见过一些以#!/bin/sh或开头的脚本#!/bin/bash。它们之间有什么区别吗?
如果我想执行一个没有设置执行权限的 bash 脚本,我可以这样做:
bash script.sh
Run Code Online (Sandbox Code Playgroud)
bash如果脚本不可执行并且我不知道正确的解释器,我应该使用什么来代替?是否有一个命令可以从 shebang 行查找解释器并用它执行脚本?
在脚本中,第一行应该指定解释器的路径。
但是在 Linux、Unix 或 BSD 的不同服务器上,此路径可能不同。
什么更可取?
#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)
或者
#!/bin/bash
Run Code Online (Sandbox Code Playgroud) 我有一个使用 shebang 的第三方脚本#!/usr/bin/env python。
根据 python 文档,这是适用于 Python v2 和 Python v3 ( https://docs.python.org/3/using/windows.html#shebang-lines ) 的脚本的正确形式。
我的 Ubuntu (WSL) 只安装了 Python 3:
~? which python
~? which python3
/usr/bin/python3
Run Code Online (Sandbox Code Playgroud)
我已将此添加到路径中,方法是在我的内容中添加以下内容~/.bashrc并获取它
~? which python
~? which python3
/usr/bin/python3
Run Code Online (Sandbox Code Playgroud)
~? . ~/.bashrc
~? env | grep PATH
PATH=/home/me/.local/bin:/home/me/bin:/usr/bin/python3:/opt/gradle/gradle-5.3.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Run Code Online (Sandbox Code Playgroud)
然而,当我运行这个脚本时,它抱怨找不到 Python。我创建了一个简短的测试文件foo,其中包含相同的 shebang 和一个print("Hello"):
~? ./foo
/usr/bin/env: ‘python’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我还能做些什么来env使用python3?
PS:我没有python 2,也不想安装它。第三方脚本的自述文件特别提到支持 Python v2 和 v3,并且根据 Python 文档本身,shebang 指出了这一点,如上所述。
PPS:添加别名并不能解决这个问题,因为它们仅在用户在提示符下调用 …
我已经看到许多文件将这一行作为其中的第一行。这究竟是什么?
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
这是什么意思?为什么有必要?