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.
简单来说,以file1作为参数sh file1执行sh命令/可执行文件.在这种情况下,file1不需要执行权限作为sh可执行文件读取和拦截文件中的命令.
./file1它只是运行/执行可执行文件file1,因此它需要可执行权限.在这种情况下,它在shebang中提到的shell上执行,#!/bin/sh如果它没有提到那么它在当前的shell上.
希望以上陈述不混乱:)