运行“bash script.sh”和“./script.sh”有什么区别?

运行“bash script.sh”和“./script.sh”有什么区别?

如果 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

相关内容