子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

 

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