子shell & 父shell(当前shell) relationship between subshell and shell

郑重声明一下的shell脚本慎重执行,慎重执行,慎重执行!!!

先在当前shell中定义变量:

some_dir=/home/jiku     (一个不存在的目录!!!)

#开始写脚本

#touch subshell.sh

#vi subshell.sh

cd $some_dir

#!/bin/bash

cd $some_dir

if [ $? -eq 0 ]; then
    rm -rf *
else
    echo 'cannot change directory!'

exit 1
fi

#chmod +x subshell.sh

#./subshell.sh

然后就悲剧了!!!!

原因:

正常情况下,脚本应该时报错的,可是

有./subshell执行方式时以当前shell为基础再去开启一个子shell来执行此脚本的

so

子shell中并没有定义$some_dir这个变量,所以为

#cd   (空)   就会回到用户的家目录下,cd命令也是执行成功的,返回值为0

所以本人将家目录直接送走了away。。。。。。

 

========================================================

解决方法1:

在脚本中定义变量

cd $some_dir

#!/bin/bash
some_dir=/home/jiku
cd $some_dir

if [ $? -eq 0 ]; then
    rm -rf *
else
    echo 'cannot change directory!'

exit 1
fi

解决方法2:

#some_dir=/home/jiku

#export some_dir

在当前shell中定义变量

然后使用export命令,将当前shell的变量设置成环境变量

=========================================

conclusion:

子Shell从父Shell继承得来的属性如下:

               当前工作目录

               环境变量

               标准输入、标准输出和标准错误输出

               所有已打开的文件标识符

子Shell不能从父Shell继承的属性:

               除环境变量和.bashrc文件中定义变量     之外的Shell变量(也就是临时定义的变量)

==========================================

以下时摘抄:

 

Linux执行Scripts有两种方式,主要区别在于是否建立subshell

1. source filename or . filename
不创建subshell,在当前shell环境下读取并执行filename中的命令,相当于顺序执行filename里面的命令

2. bash filename or ./filename
创建subshell,在当前bash环境下再新建一个子shell执行filename中的命令
子shell继承父shell的变量,但子shell不能使用父shell的变量,除非使用export
【备注:这和命名空间是相似的道理,甚至和c中的函数也有些类似】

子Shell从父Shell继承得来的属性如下:

当前工作目录
环境变量
标准输入、标准输出和标准错误输出
所有已打开的文件标识符
忽略的信号
子Shell不能从父Shell继承的属性,归纳如下:

除环境变量和.bashrc文件中定义变量之外的Shell变量
未被忽略的信号处理
3. $ (commond)
它的作用是让命令在子shell中执行

4. `commond`
和$(commond)差不多。
【这里的“ ` ”符号是撇(反单引号),不是单引号,是键盘上Esc按键下面的那个键。】

5. exec commond
替换当前的shell却没有创建一个新的进程。进程的pid保持不变
作用:
shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。
当在一个shell里面执行exec ls后,会列出了当前目录,然后这个shell就自己退出了。(后续命令不再执行)
因为这个shell已被替换为仅执行ls命令的进程,执行结束自然也就退出了。
需要的时候可以用sub shell 避免这个影响,一般将exec命令放到一个shell脚本里面,用主脚本调用这个脚本,调用点处可以用bash a.sh(a.sh就是存放该命令的脚本),这样会为a.sh建立一个sub shell去执行,当执行到exec后,该子脚本进程就被替换成了相应的exec的命令。
————————————————
版权声明:本文为CSDN博主「peacewind」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/NOStandby/article/details/82914930

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章