Answers:
对于您的特定脚本,这两种方法都可以工作,除了./script.sh
需要执行和可读位的方式之外,而bash script.sh
仅需要可读位的即可。
权限要求不同的原因在于解释脚本的程序的加载方式:
./script.sh
使您的外壳程序像正常可执行文件一样运行文件。Shell进行分叉,并使用系统调用(例如execve
)使操作系统在分支的过程中执行文件。操作系统将检查文件的权限(因此需要设置执行位),并将请求转发到程序加载器,程序加载器将查看文件并确定如何执行该文件。在Linux中,已编译的可执行文件以ELF幻数开头,而脚本以#!
(hashbang)开头。hashbang标头意味着该文件是脚本,需要由hashbang之后指定的程序解释。这允许脚本本身告诉系统如何解释脚本。
使用您的脚本,程序加载器将执行/bin/bash
并./script.sh
作为命令行参数传递。
bash script.sh
使您的shell运行bash
并script.sh
作为命令行参数传递因此,操作系统将加载bash
(甚至不查看script.sh
,因为它只是命令行参数)。然后,创建的bash
进程将解释,script.sh
因为它是作为命令行参数传递的。由于script.sh
仅bash
作为常规文件读取,因此不需要执行位。
我建议./script.sh
尽管使用,因为您可能不知道脚本需要哪个解释器。因此,让程序加载器为您确定。
. ./script.sh
是不一样的东西bash script.sh
(或./script.sh
认为剧本。#!/usr/bin/python -V
<换行符> print test
。
. script.sh
。但我同意那些不赞成.
在脚本中使用该命令的人,这些脚本并非旨在以这种方式被调用。令我惊讶的是,没有人提到,如果脚本包含exit
命令并且您将其来源,它可能会将您注销。一个较小的问题是脚本是否执行cd
,因为这也会影响父(交互)shell。
bash script.sh
使用bash直接调用脚本。
./script.sh
正在使用shebang #!/bin/bash
来确定执行方式。
如果您确实想知道,执行时将执行哪个二进制文件,则bash script.sh
可以使用找出which bash
。
因此,在您的示例中,这没有什么区别。是的,您必须chmod +x script.sh
能够直接通过执行它./script.sh
。
/bin/bash
是bash
您中的第一个没有什么区别$PATH
。
#!/bin/bash
只有在有/bin/bash
./script.sh
。