高階shell程式設計筆記 第二十章 子shell

2021-10-09 16:48:26 字數 3079 閱讀 5202

每個 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...