每個 shell 指令碼有效地執行在父 shell 的乙個子程序裡。這個父 shell 是指在乙個控制終端或在乙個 xterm 視窗中給你命令指示符的程序。
shell 指令碼也能啟動他自已的子程序。這些子 shell(即子程序)使指令碼因為效率而同時進行多個子任務執行時能做序列處理。
一般來說,指令碼裡的乙個外部命令(external command)能生成(forks)出乙個子程序,然而 bash 內建(builtin)的命令卻不這樣做,因此,內建命令比起外部的等價命令執行起來更快。
圓括號裡的命令列表
(命令 1;命令 2;命令 3;
...)
嵌在圓括號裡的一列命令在乙個子 shell 裡執行。
注意: 在子 shell 裡的變數不能被這段子 shell **塊之外的指令碼訪問。這些變數是不能被產生這個子 shell 的父程序訪問的,實際上它們是區域性變數 。
example 20-1 子shell中的變數作用域
#!/bin/bash
#echo
echo
"subshell level outside subshell = $bash_subshell"
echo
outer_variable=outer
(echo
"subshell level inside subshell = $bash_subshell"
inner_variable=inner
echo
"from subshell, \"inner_variable\" = $inner_variable"
echo
"from subshell, \"outer\" = $outer_variable"
)echo
echo
"subshell level outside subshell = $bash_subshell"
echoif[
-z "$inner_variable"
];then
echo
"inner_variable undefined in main body of shell"
else
echo
"inner_variable defined in main body of shell"
fiecho
"from main body of shell, \"inner_variable\" = $inner_variable"
echo
exit 0
參考例子31-2
在子shell中的目錄更改不會影響到父shell
example 20-2 列出使用者的配置檔案
#!/bin/bash
#file=.bashrc
for home in `awk -f: ''
/etc/passwd`do[
-d "$home"]|
|continue
# 如果沒有家目錄,跳過此次迴圈.
[-r "$home"]|
|continue
# 如果目錄沒有讀許可權,跳過此次迴圈.
(cd $home;[
-e $file
] && less $file
)done
exit 0
子shell可用於為一組命令設定臨時的環境變數
command1
command2
command3
(ifs=:
path=/bin
unset terminfo
set -c
shift 5
command4
command5
exit 3 # 只是從子 shell 退出。
)# 父 shell 不受影響,變數值沒有更改。
command6
command7
它的乙個應用是測試是否乙個變數被定義了
if
(set -u;
: variable) 2>/dev/null
#set -u:遇到不存在的變數就會報錯
then
echo
"variable is set"
fi#變數已經在當前指令碼中被設定,或是 bash 的乙個內部變數,或是可見環境變數(指已經被匯出的環境變數).
另乙個應用是檢查乙個加鎖的檔案
if
(set -c;
:> lock_file) 2>/dev/null
#set -c:所產生的檔案無法覆蓋已存在的檔案
then
:else
echo
"another user is already running that script."
exit 65
fi
程序在不同的子 shell 中可以序列地執行。這樣就允許把乙個複雜的任務分成幾個小的子問題來同時地處理。
example 20-3 在子shell裡進行序列處理
(
cat list1 list2 list3 |
sort
| uniq > list123) &
(cat list4 list5 list6 |
sort
| uniq > list456) &
#列表的合併和排序同時進.
#放到後台執行可以確保能夠序列執行.
##和下面的有相同的作用:
#cat list1 list2 list3 | sort | uniq > list123 &
#cat list4 list5 list6 | sort | uniq > list456 &
wait ##在所有的子 shell 執行完成前不再執行後面的命令.
diff list123 list456
用"|"管道操作把 i/o 流重定向到子 shell。例如 ls -al | (command)。
注意: 在乙個花括號內的**塊不會執行乙個子 shell。
第二十章 Skeletal Animation
skeletal animation 骨骼動畫 是指互相連線的變換 骨頭 組成的分層集合,以及對應的模型mesh 即骨骼的 當這些變換隨著時間變化而變化時,模型的mesh就會形成動畫效果。本章,我們將會 skeketal animation,並開發一些系統用於支援模型動畫。把乙個skeleton對映...
第二十章 限制
城城內西部某個庭院井底,滕青山正在這。趙丹塵,你想抓我,再回去練上五十年吧。喊了一嗓子後,滕青山又立即鑽進泥土中,繼續前進。泥土中,滕青山現在也不急,不過,此刻滕青山體表的 子彈型光罩 已經沒有螺旋了。通過先天真元,改變身體形狀!看來不是我想象的那樣。滕青山很清楚,先天真元光罩如果單單維持,消耗先天...
高階shell程式設計筆記 第二十四章 別名
bash別名本質上是乙個簡稱 縮寫,這可避免鍵入過長的命令序列。例如 如果我們新增 alias lm ls l more 這一行到檔案 bashrc 檔案裡,然後每次在命令列鍵入lm將會自動被替換成ls l more。這使使用者在命令列不必鍵冗長的命令序列,也避免了記憶複雜的命令及眾多選項。設定al...