给定一个 shell 脚本文件,开头为
#!/bin/bash
# (bash script here),
并已编辑,运行和命令行chmod +x
有什么区别吗?./script
bash script
答案1
这取决于你的$PATH
。 ./script
会跑/bin/bash script
。 bash script
将使用bash
路径中最先出现的任何内容,这不一定/bin/bash
,并且可能是 Bash 的不同版本。
答案2
有两个区别:
./tryit.sh
如果 bash 不在 中,则不会运行/bin
,但bash tryit.sh
如果 bash 位于PATH
.这是因为./tryit.sh
将使用 bang 路径 ( ) 中的 shell ,/bin/bash
但bash tryit.sh
将使用.bash
PATH
./tryit.sh
如果未设置执行位,则不会运行,但bash tryit.sh
会运行脚本。您已通过指定已设置该位来排除这种情况。某些编辑可能会清除该位,导致工作命令开始失败。
该命令bash tryit.sh
调用 bash 告诉它要执行的命令已在文件中找到tryit.sh
。许多程序(例如 awk、perl、python、bash、sh、ksh)都以这种方式工作。这是处理命令文件的 Unix 程序的标准 idom。
答案3
它们略有不同并且很容易犯错误。
你应该使用的(我将用两种形式编写)
./script
bash ./script
我的理由是,这是明确的,以防您更改目录。
非显式形式
script
bash script
安全性较差。bash script
将搜索当前目录,然后搜索 PATH 环境变量中的目录,script
其本身仅在 PATH 目录中搜索。运行与预期不同的命令可能会破坏您的文件。
答案4
如果我没记错的话,以下两个是完全相同的:
$ ./script
和
$ source script
所以使用./
“命令”实际上会source
在引擎盖下调用,它本身是一个bash
内置命令。或者,在另一种解释中,它们可能被称为彼此的别名。
然而:第一次调用要求您(用户)为所有者或组设置+x
(=可执行)标志chmod
,否则您将收到“权限被拒绝”错误,而使用该source
命令执行甚至是可能的没有旗帜+x
。因此bash
,例如,当您想要从 NTFS 格式的随身碟运行脚本时,后者有时会成为您的救星,因为它chmod
无法在那里工作。
我思考这也会以某种方式回答你的问题。
因为,因此,bash script
和source script
不可能完全相同;一个正在调用bash
程序本身将您的脚本作为参数给出,而另一个正在调用其中bash
之一内置命令将您的脚本作为参数。尽管结果很可能是相同的(至少在日常使用中),但在这两种情况下实现该结果的方式有些不同。