Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Bash shell中bash、sh、source及“.”点等五种执行方式的区别与联系

Bash shell中bash、sh、source及“.”点等五种执行方式的区别与联系

作者头像
耕耘实录
发布于 2018-12-20 06:48:26
发布于 2018-12-20 06:48:26
3.7K00
代码可运行
举报
文章被收录于专栏:耕耘实录耕耘实录
运行总次数:0
代码可运行

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

在众多Linux发行版中bash shell 可谓是随处可见。作为众多发行版的首选shell,对于bash shell的学习对我们来说,显得格外重要。在学习bash shell的过程中,bash、sh、source及英文输入状态下的点号经常交替出现,他们看起来作用都差不多,但是深究下去,他们也有着不小的区别与联系。下面就让我们以具体实验来看一下它们之间的区别与联系吧!

一、查看当前系统支持的shell类型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@Geeklp-BashShell ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

以上列出了当前系统所支持的shell类型。查看shell的历史我们可以知道,我们通常所说的bash shell(bash)全称为GNU Bourne-Again SHell。在目前的发行版中,sh已经成为bash的一个软连接。在man sh的时候大家都会发现,其实man出来的手册时bash的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@Geeklp-BashShell ~]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 1120 10:05 /bin/sh -> bash
[root@Geeklp-BashShell ~]# ll /bin/bash
-rwxr-xr-x. 1 root root 960472 83 05:11 /bin/bash
二、建立实验脚本

a.sh的内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash - 
#===============================================================================
#          FILE: a.sh
#         USAGE: ./a.sh 
#        AUTHOR: Geeklp (IVAN DU), geeklp@qq.com
#  ORGANIZATION: GEEKLP
#       CREATED: 20180119172645秒
#      REVISION:  ---
#===============================================================================
set -o nounset
myName=`whoami`                              # Treat unset variables as an error
age=28
echo "My name is $myName .I am $age this year."

b.sh的内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash - 
#===============================================================================
#          FILE: b.sh
#         USAGE: ./b.sh 
#        AUTHOR: Geeklp (IVAN DU), geeklp@qq.com
#  ORGANIZATION: GEEKLP
#       CREATED: 20180119173137秒
#      REVISION:  ---
#===============================================================================
set -o nounset                              # Treat unset variables as an error
echo "My name is $myName . I am $age this year."
三、具体探讨这几种执行方式的区别与联系

bash、sh分别执行a.sh和b.sh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Geeklp@Geeklp-BashShell ~]$ bash a.sh 
My name is Geeklp .I am 28 this year.
[Geeklp@Geeklp-BashShell ~]$ bash b.sh 
b.sh:11: myName: 为绑定变量
[Geeklp@Geeklp-BashShell ~]$ sh a.sh 
My name is Geeklp .I am 28 this year.
[Geeklp@Geeklp-BashShell ~]$ sh b.sh 
b.sh:11: myName: 为绑定变量

可以看出来,bash及sh执行的脚本效果是一致的。 source及”.”分别执行a.sh、b.sh。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Geeklp@Geeklp-BashShell ~]$ source a.sh 
My name is Geeklp .I am 28 this year.
[Geeklp@Geeklp-BashShell ~]$ source b.sh 
My name is Geeklp . I am 28 this year.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Geeklp@Geeklp-BashShell ~]$ . ~/a.sh 
My name is Geeklp .I am 28 this year.
[Geeklp@Geeklp-BashShell ~]$ . ~/b.sh 
My name is Geeklp . I am 28 this year.

从上面的2个代码块中,我们可以看出,b.sh脚本直接引用了a.sh中的变了,如果我们依次执行几个有关联的脚本就可以采用这种方式,否则则使用bash及sh比较恰当。 注意:代码块2中的点与脚本路径中间有至少一个空格。 接下来,我们继续以点“.”来运行a.sh及b.sh。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Geeklp@Geeklp-BashShell ~]$ ./a.sh
bash: ./a.sh: 权限不够

这个点与执行脚本之间无空格,表示执行当前目录下的a.sh脚本,相当于~/a.sh。b.sh也是一样的结果,无需讨论。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Geeklp@Geeklp-BashShell ~]$ chmod u+x [ab].sh
[Geeklp@Geeklp-BashShell ~]$ ./a.sh 
My name is Geeklp .I am 28 this year.
[Geeklp@Geeklp-BashShell ~]$ ./b.sh 
./b.sh:11: myName: 为绑定变量
[Geeklp@Geeklp-BashShell ~]$ ~/a.sh 
My name is Geeklp .I am 28 this year.
[Geeklp@Geeklp-BashShell ~]$ ~/b.sh 
/BashShell/b.sh:11: myName: 为绑定变量

从以上代码块中不难看出:通过”.”(无空格)来执行脚本时需要给需要执行的脚本加上执行权限,否则无法执行。加了权限之后,执行效果与bash及sh一致,不继承变量。

四、结论
  1. bash与sh在对于脚本执行来说,效果一致,不继承除了当前shell之外的变量值。在无空格“.”(相对路径)、绝对路径且有执行权限的脚本执行中,效果与bash及sh一致。
  2. source及带空格的“.”执行效果一致,且会继承其他shell的变量。
  3. 除了不带空格的“.”之外,其他脚本的执行都不需要给脚本增加执行权限。
  4. bash、sh、不带空格的点(相对路径)或绝对路径中,脚本是在子进程中执行的。在source及带空格的点中,脚本是在父进程中执行的,差别很大。
五、一个小疑问

请大家看一下以下命令的效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@Geeklp-BashShell ~]# bash
[root@Geeklp-BashShell ~]# sh
sh-4.2# exit
exit
[root@Geeklp-BashShell ~]# bash --posix
bash-4.2# 

在上文中,我们能够看到sh是bash的一个软连接,但是单独输入bash和sh命令时,所呈现的效果却不一致?这里目前我并不是很清楚,麻烦有知道的小伙伴告知一下这是为什么?非常感谢!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年01月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用Vim完成BashShell脚本编写(bash-support : Bash IDE)
版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢。
耕耘实录
2018/12/20
1.1K0
shell脚本快速入门之-----深入介绍Expect免交互
spawn 启动追踪 —> expect 匹配捕捉关键字 ——> 捕捉到将触发send 代替人为输入指令—> interact /expect eof
不吃小白菜
2020/09/03
2.4K0
linux之shell编程基本语法
  Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell。Shell也是一门编程语言<解释型的编程语言>,即shell脚本<就是在用linux的shell命令编程>。一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的。
intsmaze-刘洋
2018/08/29
8410
linux系列之shell编程(一)
$n 功能描述:n为数字,$0 代表该脚本名称,$1-$9代表第一到第九个参数,十以内的参数,十以上的参数需要用大括号包含,如${10}
趣学程序-shaofeer
2020/07/11
1.4K0
linux系列之shell编程(一)
shell编程基本语法和变量
一.编写shell脚本基本格式 拿最简单的hello word举例 .#!/bin/bash echo 'hello world' .#!/bin/bash:告诉计算机,使用bash解释器来执行代码 echo: 打印 二.运行shell脚本 方法一(推荐使用) chmod 777 myshell.sh #给文件权限 ./myshell.sh #运行文件 方法2 sh myshell.sh 三.注释 单行注释 #内容 多行注释 :<<! 内容 ! 四.定义变量 基本语法 1.定义变量:变
小小咸鱼YwY
2020/06/19
7530
shel脚本基础系列(二)语法+运算+判断
虽然自己是一名java程序员,做后端的,但是最近工作中经常需要看别人写的脚本去运行项目,所以作为后端程序员,我们也需要了解一下shell语法,会读懂一些基本的shell脚本。
jiankang666
2022/05/12
3740
Linux Shell 从入门到删除根目录跑路指南
shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭口之利器~ 今天就来聊聊 linux 下一个常见的问题:如何避免误删目录。下文会详细的讲述不同的场景下误删目录,以及相应的解决方案。 1、变量为空导致误删文件 base_path=/usr/sbin tmp_file=`cmd_invalid` # rm -rf $base_path/$tmp_file 这种情况下如果 cmd 执行出错或者返回为空,
用户1177713
2018/02/24
2.2K0
Linux Shell 从入门到删除根目录跑路指南
shell的进阶上
shell script 其实就是纯文本档,我们可以编辑这个文件,然后让这个文件来帮我们一次执行多个指令,或者是利用一些运算与逻辑判断来帮我们达成某些功能。所以,要编辑这个文件的内容时,当然就需要具备有 bash 指令下达的相关认识。
小柒吃地瓜
2020/04/22
6770
Linux Shell 脚本编程基础
Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核,不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序.Shel编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果,下面我们会介绍Shell-Script的编写.
王瑞MVP
2022/12/28
2.1K0
Linux Shell 脚本编程基础
高效的Shell编程建议及入坑
描述:在进行shell脚本语言编写的时候,不仅要注意写的功能,更要注意他的美观以及通用性,还需要让其他参与运维的人都能看懂;
全栈工程师修炼指南
2022/09/28
9060
高效的Shell编程建议及入坑
Linux Shell编程
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。看一个示意图
用户9615083
2022/12/25
36.6K0
Linux Shell编程
Shell基础入门
Shell基础入门 linux系统是如何操作计算机硬件CPU,内存,磁盘,显示器等?使用linux的内核操作计算机的硬件Shell介绍... Shell计算命令 Shell计算命令:expr命令
乐心湖
2021/01/18
2.4K0
Shell基础入门
shell | 不同执行方式的区别
shell 脚本通常有 sh filename、bash filename、./filename、source filename 这四种执行方式
Amadeus
2022/10/25
6070
shell | 不同执行方式的区别
Shell 编程(3)-bash 配置文件
用户登录系统时,bash 会进行一系列操作,如加载各种 bash 配置文件,设置或清空一些列的变量,有时还会执行一些自定义的命令。
懒人的小脑
2019/01/26
1.5K0
Shell 编程(3)-bash 配置文件
0614-5.16.1-同一OS用户并行Shell脚本中kinit不同的Principal串掉问题分析
在前面的文章《CDH5.15.0-同一OS用户下不同Kerberos用户执行脚本Principal串掉问题分析》中Fayson主要介绍了同一个OS用户下并发调度Python脚本时会导致Principal账号串掉,通过在Python代码中指定KRB5CCNAME环境变量解决问题,本篇文章Fayson主要介绍通过同一OS用户下并发调度Shell脚本进行不同用户Kerberos认证时Principal账号串掉问题分析及解决。
Fayson
2019/05/13
2.1K0
0614-5.16.1-同一OS用户并行Shell脚本中kinit不同的Principal串掉问题分析
bash和shell的入门中
里面默认有三行,较有趣的地方在于 r 与 m。 就 如同 $PS1 这变量一样,issue 这个文件的内容也是可以使用反斜杠作为变量取用!你可以 man issue 配合 man agetty 得到底下的结果:
小柒吃地瓜
2020/04/23
1K0
3小时精通shell脚本
linux操作系统包含内核kernel,人机交互程序与应用,其中shell就属于人机交互程序。
半旧518
2022/10/26
5340
3小时精通shell脚本
shell编程菜鸟教程_java并发编程实战 pdf
Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并把它送入内核去执行。内核是Linux系统的心脏,从开机自检就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存。Shell是一种应用程序,当用户登录Linux系统时,Shell就会被调入内存去执行。Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令。
全栈程序员站长
2022/09/23
4.6K0
shell编程菜鸟教程_java并发编程实战 pdf
编写Shell脚本的最佳实践
由于工作需要,最近重新开始拾掇shell脚本。虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看。而且当我在看其他人写的脚本的时候,总觉得难以阅读。毕竟shell脚本这个东西不算是正经的编程语言,他更像是一个工具,用来杂糅不同的程序供我们调用。因此很多人在写的时候也是想到哪里写到哪里,基本上都像是一段超长的main函数,不忍直视。同时,由于历史原因,shell有很多不同的版本,而且也有很多有相同功能的命令需要我们进行取舍,以至于代码的规范很难统一。 考虑到上面的这些原因,我查阅了一些相关的文档,发现这些问题其实很多人都考虑过,而且也形成了一些不错的文章,但是还是有点零散。因此我就在这里把这些文章稍微整理了一下,作为以后我自己写脚本的技术规范。
mythsman
2022/11/14
8810
编写Shell脚本的最佳实践
编写 Shell 脚本的最佳实践
由于工作需要,最近重新开始拾掇 shell 脚本。虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看。而且当我在看其他人写的脚本的时候,总觉得难以阅读。毕竟 shell 脚本这个东西不算是正经的编程语言,他更像是一个工具,用来杂糅不同的程序供我们调用。因此很多人在写的时候也是想到哪里写到哪里,基本上都像是一段超长的 main 函数,不忍直视。同时,由于历史原因,shell 有很多不同的版本,而且也有很多有相同功能的命令需要我们进行取舍,以至于代码的规范很难统一。
用户6543014
2019/10/25
1.1K0
编写 Shell 脚本的最佳实践
相关推荐
用Vim完成BashShell脚本编写(bash-support : Bash IDE)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验