有时我看到一些脚本是通过"sh"命令执行的, 有时则是通过"./"命令执行的。我不太理解它们之间的确切区别。请帮帮我。
sh file
命令在新的 shell 进程中执行一个 shell 脚本文件。
. file
命令在当前 shell 进程中执行一个 shell 脚本文件。
./file
命令将在当前目录下执行该文件。该文件可以是二进制可执行文件,也可以以哈希注释行(文件的第一行形式为 #!....
,例如文件中的 #!/usr/bin/ruby
表示需要将该脚本作为 Ruby 文件执行)。该文件需要设置可执行权限。
例如,如果你有一个名为 test.sh
的脚本:
#!/bin/sh
TEST=present
如果你使用sh test.sh
来执行它,你会启动一个新的sh
(或者更可能是bash
,因为现代系统中一个软链接到另一个),然后在其中定义一个新的变量,最后退出。随后的echo $TEST
打印出一个空行 - 变量没有在外部shell中设置。
如果你使用. test.sh
来启动它,你将使用当前shell执行脚本。结果echo $TEST
将输出present
。
如果你使用./test.sh
启动它,第一行#!/bin/sh
将被检测,然后它就像你写了/bin/sh ./test.sh
一样,这种情况下与第一种情况相同。但如果哈希替换行是#!/usr/bin/perl -w
,那么文件将以/usr/bin/perl -w ./test.sh
执行。
bash
会认为它是一个 shell 脚本文件。如果你想使用其他解释器,就需要哈希行。 - Amadansh file1
执行带参数 file1 的 sh 命令/可执行文件。在这种情况下,file1 文件不需要执行权限,因为 sh 可执行文件会读取并拦截文件中的命令。./file1
就是运行/执行一个可执行文件 file1,因此需要可执行权限。如果该文件中有 shebang #!/bin/sh
,则在该 shell 中执行,否则在当前 shell 中执行。使用sh命令,我们可以运行没有执行权限的脚本,只需将其作为sh的参数运行即可;但是./需要执行权限,因为它应该是一个可执行文件。在两种情况下,都会创建一个新的shell来运行脚本。请看下面的示例:
root@ub18:~/shell# vi test1.sh
#!/bin/bash
my_var=hello
echo $my_var
#Shows the current shell processid
echo $$
root@ub18:~/shell# echo $$
1896
root@ub18:~/shell# sh test1.sh
hello
2093
root@ub18:~/shell# ./test1.sh
-su: ./test1.sh: Permission denied
root@ub18:~/shell# chmod +x ./test1.sh
root@ub18:~/shell# ./test1.sh
hello
2102
root@ub18:~/shell# ./test1.sh
hello
2103
root@ub18:~/shell# ./test1.sh
hello
2104
root@ub18:~/shell# sh test1.sh
hello
2106
./file_name.sh
运行它,通常情况下,您可以通过sh file_name.sh
运行。如果您将文件更改为可执行文件chmod a+x file_name.sh
,则可以通过./file_name.sh
运行您的文件。
. file
应该被解释为源文件。使用单词executes
可能会产生误解,即我们直接执行它。>source 或者等效但标准的点号 . 不执行脚本,而是从脚本文件中读取命令,然后逐行在当前 shell 环境中执行它们。 - Ngok Chao HO