Linux跑脚本用sh和./有什么区别?

时间:2021-07-06 00:56:54

  一个很有意思的例子:

  sh是一个shell。运行sh a.sh,表示我使用sh来解释这个脚本;如果我直接运行./a.sh,首先你会查找脚本第一行是否指定了解释器,如果没指定,那么就用当前系统默认的shell(大多数linux默认是bash),如果指定了解释器,那么就将该脚本交给指定的解释器.

比如a.run文件内容是这个:

#!/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")'

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

[root@localhost ~]# ls -al `which sh`
lrwxrwxrwx. 1 root root 4 6月 21 2018 /usr/bin/sh -> bash

[feishu@localhost ~]$ echo $SHELL
/bin/bash

  可以看到 sh其实就是bash,那么在这个发行版中,你如果你写的是一个shell脚本,而且脚本第一行没申明shell解释器,那么使用./a.sh和sh a.sh并没有什么区别

  本文转自:https://www.cnblogs.com/leanfish/p/9956516.html