UNIX中"./"和"sh"的区别

40

有时我看到一些脚本是通过"sh"命令执行的, 有时则是通过"./"命令执行的。我不太理解它们之间的确切区别。请帮帮我。


也许这个链接也很有趣:https://askubuntu.com/q/22910/354350 - DJCrashdummy
1
@Fidel 提供了一个好的答案,我没有足够的声望来添加评论,但 . file 应该被解释为源文件。使用单词 executes 可能会产生误解,即我们直接执行它。>source 或者等效但标准的点号 . 不执行脚本,而是从脚本文件中读取命令,然后逐行在当前 shell 环境中执行它们。 - Ngok Chao HO
4个回答

60

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执行。


非常感谢。虽然我能够通过./运行.sh文件,而不需要提及hashbang行。这是怎么可能的? - Shashank Vivek
1
没有哈希行,bash 会认为它是一个 shell 脚本文件。如果你想使用其他解释器,就需要哈希行。 - Amadan
1
我找到的最有用的答案。 - zzzgoo

14
简单来说,sh file1 执行带参数 file1sh 命令/可执行文件。在这种情况下,file1 文件不需要执行权限,因为 sh 可执行文件会读取并拦截文件中的命令。
./file1 就是运行/执行一个可执行文件 file1,因此需要可执行权限。如果该文件中有 shebang #!/bin/sh,则在该 shell 中执行,否则在当前 shell 中执行。
希望上述说明不会让您感到混乱 :)

3

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

1
当您的文件不可执行时,您无法使用./file_name.sh运行它,通常情况下,您可以通过sh file_name.sh运行。如果您将文件更改为可执行文件chmod a+x file_name.sh,则可以通过./file_name.sh运行您的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接