鄭重聲明一下的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