如果 script.sh 只是典型的东西,比如
#!/bin/bash
echo "Hello World!"
有运行脚本的首选方法吗?我认为你首先必须 chmod 它以便它变得可执行?
答案1
对于您的特定脚本,任何一种方法都可以工作,除了./script.sh
需要执行和可读位,而bash script.sh
只需要可读位。
权限要求差异的原因在于解释脚本的程序的加载方式:
./script.sh
使您的 shell 运行该文件,就像它是常规可执行文件一样。
shell fork 自身并使用系统调用(例如execve
)使操作系统执行分叉进程中的文件。操作系统将检查文件的权限(因此需要设置执行位)并将请求转发给程序加载器,它查看文件并确定如何执行它。在 Linux 中编译的可执行文件以极低频神奇的数字,而脚本以#!
幻数,而脚本以(哈希棒)。 hashbang 标头意味着该文件是一个脚本,需要由 hashbang 之后指定的程序来解释。这允许脚本本身告诉系统如何解释脚本。
对于您的脚本,程序加载器将执行并 作为命令行参数/bin/bash
传递。./script.sh
bash script.sh
使您的 shell 运行并作为命令行参数bash
传递script.sh
因此操作系统将加载bash
(甚至不看script.sh
,因为它只是一个命令行参数)。然后,创建的bash
进程将解释 ,script.sh
因为它是作为命令行参数传递的。因为script.sh
仅作为常规文件读取bash
,所以不需要执行位。
不过,我建议使用./script.sh
,因为您可能不知道脚本需要哪个解释器。因此,让程序加载器为您确定这一点。
答案2
bash script.sh
使用 bash 直接调用脚本。
./script.sh
正在使用 shebang#!/bin/bash
来确定如何执行。
如果您确实想知道执行哪个二进制文件,则bash script.sh
可以使用which bash
.
所以在你的例子中这没有什么区别。是的,您必须chmod +x script.sh
能够直接通过./script.sh
.
答案3
像这样创建一个文件Delete_Self.sh:
#!/bin/rm
echo I am still here!
运行此脚本,sh Delete_Self.sh
您将看到“我还在这里!”回响着。
使其可执行,然后运行它,./Delete_Self.sh
您将看到没有任何回显,而文件Delete_Self.sh
本身却消失了。
所以区别在于:
bash script.sh
将忽略 #!行,因为 bash 被指定为运行 script.sh 的程序。./script.sh
将读取#!行来确定要运行的程序script.sh
。
答案4
除了其他答案之外,了解通过./script.sh
(i) 和source ./script.sh
(ii) 运行脚本之间的区别很有用 - (i) 版本创建一个新的 shell 来运行命令,而 (ii) 在当前版本中运行它shell - 如果可执行文件更改了可执行文件退出后需要保留的环境变量,则该命令可能是强制的。例如,要激活 python conda 环境,必须使用以下命令:
source activate my_env
source
注意您可能会遇到的另一种选择是.
内置的,即
. activate my_env