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

Sha*_*vek 20 unix shell

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

Ama*_*dan 36

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

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

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


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

#!/bin/sh

TEST=present
Run Code Online (Sandbox Code Playgroud)

并且你执行它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.


Fid*_*del 8

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

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

希望以上陈述不混乱:)