UNIX中“./”和“sh”的区别

时间:2014-02-28 05:55:32

标签: shell unix

有时我看到很少有脚本通过“sh”命令执行,有时通过“./”命令执行。我无法理解它们之间的确切区别。请帮帮我。

4 个答案:

答案 0 :(得分:31)

sh file在新的shell进程中执行shell脚本文件。

. file在当前shell进程中执行shell脚本文件。

./file将在当前目录中执行该文件。该文件可以是二进制可执行文件,也可以以hashbang行开头(文件的第一行以#!....的形式存在,例如文件中的#!/usr/bin/ruby表示脚本需要执行作为Ruby文件)。该文件需要设置可执行标志。


例如,如果您有脚本test.sh

#!/bin/sh

TEST=present

并且您使用sh test.sh执行它,您将启动一个新的sh(或更确切地说bash,最可能的是,因为在现代系统中,一个软链接到另一个),然后在其中定义一个新变量,然后退出。随后的echo $TEST打印一个空行 - 该变量未在外壳中设置。

如果使用. test.sh启动它,则使用当前shell执行脚本。 echo $TEST的结果将打印present

如果您使用./test.sh启动它,则会检测到第一行#!/bin/sh,然后就像您编写/bin/sh ./test.sh一样,在这种情况下归结为第一行场景。但是,如果hashbang行是#!/usr/bin/perl -w,那么该文件将使用/usr/bin/perl -w ./test.sh执行。

答案 1 :(得分:8)

简单来说,sh file1 file1 作为参数执行 sh命令/可执行文件。在这种情况下, file1不需要执行权限作为sh可执行文件读取并拦截文件中的命令。

./file1它只是运行/执行可执行文件 file1 ,因此它需要可执行权限。在这种情况下,它在shebang #!/bin/sh中提到的shell上执行,如果它没有提到那么它在当前的shell上。

希望上述陈述不混乱:)

答案 2 :(得分:1)

使用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

答案 3 :(得分:0)

当文件不是可执行文件时,通常无法使用./file_name.sh运行,如果将文件更改为可执行文件sh file_name.sh,则可以通过{{ 1}}