什么是bash?

Bash is an sh-compatible command language interpreter that executes commands read from the
standard input or from a file.
通过man bash(man需要提前安装,yum install man man-pages -y)了解到,bash原来就是能够解释从标准输入和文件的命令。
bash是shell的一个实现,是一个软件。人写字符串,吧唧一回车,先解释,符合语法,解释明白了,寻找命令、执行命令
用户交互输入:

  • 用户输入命令,ls -l

文本文件输入:

  • vi /etc/profile

  • vi test.txt

    比如我在~/shell/下创建一个test.txt:

echo "hello world!"ls -l /

然后通过bash去启动它:

/bin/bash  ~/shell/test.txt

一个有趣的栗子!

这里做一个验证,多次启动/bin/bash,然后再去查看它的进程树pstree:

2号bash是被1号bash启动的,1号bash又是被前面的bash启动的。主线程——子线程——子线程——子线程,就这么被串起来来。bash就是一个启动器,它会启动一个程序。bash读取文件执行的方式一共有2类,在当前进程执行,在子线程执行。
这里不妨做一个实验,修改text.txt文件的内容,追加一行echo $$(打印进程id号)

很明显,这两个进程id号不一样。家目录打印进程id号是处于当前进程,然后字符串切割得到命令,启动了另一个bash,该bash中再去打印进程id号,所以这两个id号并不一样。

当然,test.txt也可以在父进程执行(毕竟父进程能够启动bash,更何况test.txt呢?)

source插曲

[root@node1 ~]# type source
source is a shell builtin

就好比说source是一个方法,test.txt就是参数。在Linux系统中,脚本只在2个地方执行,主进程、子进程。当然,用 . 跟source效果一样。

如何偷懒?

为了执行这个test.txt文件,每次都要/bin/bash ~/shell/test.txt。真的好累!现在我就想让这个文件就像命令一样,吧唧一执行就能运行了。如此这样,就得修改一下这个文本文件了。

#!/bin/bash
echo "hello world!"
ls -l /
echo $$

然后给这个文件加上一个“执行”的权限:

chmod  u+x ~/shell/test.txt

设定权限之后,就可以像使用命令一样,直接使其执行了:

但是,test.txt毕竟是一个文本文件,不是程序。脚本文件能够执行的本质是第一行是可执行程序。脚本说到底也是个文本文件,给到内核后,内核就会发现它是个文本文件。然后内核就会拿着固有的"#!" 去脚本的第一行,把后面的路径拿出来,把他变成一个进程。同时,使这个路径反读该脚本文件。过滤掉第一行,直接读剩下的。

关于父进程、子进程

大家都知道,jdk的配置是在/etc/profile文件中,如果我在该文件末行追加一个变量:export HUSKY=100 ,如果我用/bin/bash /etc/profile(用bash读取profile文件)然后再echo HUSKY,是拿不到值的。因为/bin/bash启动了一个子进程,变量同样也被定义在了子进程。在主进程echo是没有效果的。
可是如果换一种方式,使用source /etc/profile之后,再去echo HUSKY是可以拿到变量的值的。原因不多说了,source会使文件在主进程被执行!

再举一个有趣的栗子!

再次修改test.txt文件,在末行追加内容:

#!/bin/bash
echo "hello world!"
ls -l /
echo $$
exit 0

Tip:exit 0代表正常退出,非0表示异常退出
如果使用/bin/bash读这个文件,没有任何异常出现。因为bash开启了子进程,遇到exit 0使子进程退出。可是如果用source读这个文件,一执行,链接就断开了。

Shell-bash相关推荐

  1. linux超级基础系列——什么是shell? bash和shell有什么关系

    什么是Shell?        shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序.你在提示符下输入的每个命令都由shell先解释然后传给Linux内核.    ...

  2. awk,gawk调用shell,bash中的变量 笔记221106

    awk,gawk调用shell,bash中的变量 笔记221106 "'${变量名}'" 双 包 单 包 ${} 包 变量名 "'"${变量名}"'& ...

  3. shell(bash)替换字符串大全

    shell(bash)替换字符串大全 1. 替换(只替换一个) 用varrB=${varA/str1/str2} $ var="AAAszip_BBB.zip";var2=${va ...

  4. shell bash脚本_如何在Windows 10上创建和运行Bash Shell脚本

    shell bash脚本 With the arrival of Windows 10's Bash shell, you can now create and run Bash shell scri ...

  5. 通过shell/bash脚本使用ffmpeg批量去除视频固定片头和片尾(Cygwin环境)

    通过shell/bash脚本使用ffmpeg批量去除视频固定片头和片尾(Cygwin环境) 任务需求: 基本情况: 技能需求: 操作流程概括: 运行通过的shell脚本: 小结 任务需求: 对一批视频 ...

  6. shell/bash脚本命令教程

      shell/bash其实就是我们日常在unix系统终端中执行的语句,只是通常我们在命令行中都是单行语句执行的,而有时,我们希望将一些操作命令写到一个文本中,让电脑自动按顺序或是并行地执行这些命令, ...

  7. 反弹shell bash -i命令

    目录   0x01 什么是反弹shell?   0x02 命令拆分详解   0x03 文件描述符   0x04 shell 输入/输出重定向   0x05 输入输出结合获得shell 什么是反弹she ...

  8. 国内Linux shell,Bash shell 的诞生 | Linux 中国

    原标题:Bash shell 的诞生 | Linux 中国 本周的<代码英雄>播客深入研究了最广泛使用的.已经成为事实标准的脚本语言,它来自于自由软件基金会及其作者的早期灵感. -- Ma ...

  9. linux -ksh,Linux Shell - bash ksh

    我知道shell有好多种.例如:TCSH SHELL . BASH SHELL 等. 请问共有几种shell,他们都有什么区别? 我的系统是RH9,用的是什么shell/ 谢谢! 目前流行的Shell ...

  10. Linux + Shell bash / sh / ksh / csh / tcsh

    Redhat Gnome Terminal 快捷键 http://huangchao200701.javaeye.com/blog/263002 常用 win+n切换背景颜色风格 alt+tab=不用 ...

最新文章

  1. 请查收!深度学习超详细发展路线大公开!
  2. eltable刷新整个表格方法_利用SSAS实现PBI报表增量刷新
  3. python安装百度aip_Python3.6安装aip
  4. magento 首页添加最新产品 Display new products on the home page
  5. [转载]Linux批量替换不同文件中的相同字符串
  6. HMM学习最佳范例一:介绍
  7. zk里面调用javascript方法
  8. PHP学习笔记之PDO
  9. tomcat source code in eclipse
  10. Verilog初级教程(8)Verilog中的assign语句
  11. MDT修改部署时的背景图
  12. 瑞丽衰落信道的MATLAB仿真
  13. 虚拟机上键盘右边的数字小键盘为什么不能使用
  14. 查询选修张老师讲授所有课程的学生(MSSQL)
  15. 台式电脑如何修复计算机,台式电脑没有声音了怎么恢复(在家用这两个方法轻松解决)...
  16. 免费图片素材网站收集
  17. ubuntu16.04下安装dnw和fastboot工具,解决开发板只有uboot系统,没有网络的情况下,通过dnw和fastboot传送文件到开发板
  18. CUDA总结:Occupancy
  19. 37、免驱动USB双目同步测距3D活体深度检测和RV1126结合V4L开发USB摄像头使用
  20. 测试小故事52:怎么测?

热门文章

  1. JAVA9模块化详解(一)——模块化的定义
  2. ScheduledThreadPoolExecutor详解
  3. Unity NGUI ScrollView 苹果式滑动
  4. SQL Server 中@@IDENTITY的用法
  5. C# http post 地址
  6. IE7下元素的 'padding-top' 遇到 'clear' 特性在某些情况下复制到 'padding-bottom'
  7. 内网安全新趋势之应对移动设备的威胁
  8. [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
  9. html-body标签中相关标签 02
  10. 软件开发项目云端All