linux 下的 source,sh,./三者区别

时间:2021-07-13 09:09:44

前言

工作中遇到的问题,总结一下,参考较多文章总结的,若有错误,望请指出,谢谢!

source

Linux source命令:

通常用法:source filepath 或 . filepath

它的功能:使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。例如,当我们修改了/etc/profile文件,并想让它立刻生效,而不用重新登录,就可以使用source命令,如source /etc/profile。

source命令(从 C Shell 而来)是bash shell的内置命令;点命令(.),就是个点符号(从Bourne Shell而来)是source的另一名称。这从用法中也能看出来。

使用这个命令执行脚本即使没有执行权限也可以运行。

sh

sh是一个shell。运行sh xxx.sh,表示我使用sh来解释这个脚本,sh和source命令
一样,没有执行权限也可以运行脚本。

但是这两者还是有些区别的,在鸟哥的书中有下图:

linux 下的 source,sh,./三者区别

./

./xxxx
使用这个命令需要先将文件提升为可执行的文件才可以进行命令的使用

如何提升权限,请看这篇总结——————linux用户组以及权限总结

以下在知乎看到的区别:

如果我直接运行./xxx.sh,首先你会查找脚本第一行是否指定了解释器,如果没指定,那么就用当前系统默认的shell(大多数linux默认是bash),如果指定了解释器,那么就将该脚本交给指定的解释器。例如我下面的代码中,我指定了这是一个python脚本,而不是shell脚本:

#!/usr/bin/python
print("This is Python script")

那么你如果运行./a.run,结果就是输出一行文字,但是如果你运行sh a.run,会报错:

[feishu@localhost tmp]$ ./a.run 
This is Python Script
[feishu@localhost tmp]$ sh a.run
a.run: line 2: syntax error near unexpected token `"This is Python Script"'
a.run: line 2: `print("This is Python Script")'

作者:Virtual
链接:https://www.zhihu.com/question/41441630/answer/91061860
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

因为这是一个python脚本,sh看不懂(注意,linux下后缀通常不是很严格,.run后缀是我随意命名的,和windows有点区别).回到你的问题,你是写了一个shell脚本,想问./a.sh和sh a.sh区别,这个要看你系统默认shell和脚本了,如果你写的是一个sh ( Bourne shell )脚本而且第一行申明了解释器为sh,那么没区别,但是如果你写的是一个bash(Bourne Again SHell) 脚本,那结果就可能有区别了,因为bash和sh的内置命令、语法等有些不一样。

参考文章

1.http://www.cnblogs.com/pkufork/p/linux_source.html
2.https://www.zhihu.com/question/27673228
3.https://www.zhihu.com/question/41441630/answer/91021682