有时我看到很少有脚本通过“sh”命令执行,有时通过“./”命令执行。我无法理解它们之间的确切区别。请帮帮我。
答案 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}}