shell十三問之7:()與{}差在哪?
嗯,這次輕鬆一下,不講太多... ^_^
先說一下,為何要用()或者{}好了。
許多時候,我們在shell操作上,需要在 一定的條件下執行多個命令,也就是說, 要麼不執行,要麼就全執行,而不是每次 依序的判斷是否要執行下一個命令。
或者,要從一些命令執行的先後次序中得到結果, 如算術運算的2*(3+4)那樣...
這時候,我們就可以引入"命令群組
"(command group
)
的概念:將許多命令集中處理。
在shell command line
中,一般人或許不太計較()
與
{}
這兩對符號的差異,雖然兩者都可以將多個命令當作群組處理,
但若從技術細節上,卻是很不一樣的:
()
將command group
置於sub-shell
(子shell
)中去執行,也稱nested sub-shell
。{}
則是在同一個shell
內完成,也稱non-named command group
。
若你對上一章的fork與source的概念還記得的話, 那就不難理解兩者的差異了。
要是在 command group
中扯上變量及其他環境的修改,
我們可以根據不同的需求來使用()
或{}
。
通常而言, 若所作的修改是臨時的,且不想影響原有或以後的設定,
那我們就使用nested sub-shell
, 即()
;
反之,則用non-named command group
, 即{}
。
是的,光從command line
來看,()
與 {}
差別就講完了,夠輕鬆吧~~~, ^_^
然而,這兩個meta
用在其他command meta
或領域中(如Regular Expression),
還是有很多差別的。
只是,我不打算再去說明瞭,留給讀者慢慢發掘好了...
我這裡只想補充一個概念,就是function
。
所謂function
,就是用一個名字去命名一個command group
,
然後再調用這個名字去執行command group
。
從non-named command group
來推斷,
大概你也可以推測到我要說的是{}
了吧?(yes! 你真聰明 ^_^)
在bash中,function的定義方式有兩種:
- 方式一:
function function_name { command1 command2 command3 ..... }
- 方式二:
function_name () { command1 command2 command3 ...... }
用哪一種方式無所謂,
只是碰到所定義的名稱與現有的命令或者別名衝突的話,
方式二或許會失敗。
但方式二起碼可以少打個function
這一串英文字符,
對懶人來說(如我),有何樂而不為呢?...^_^
function
在一定程度上來說,也可以稱為"函數",
但請不要與傳統編程所使用的"函數"(library)搞混了,
畢竟兩者差異很大。
唯一相同的是,我們都可以隨時用"已定義的名稱"來調用它們...
若我們在shell操作中,需要不斷地重複某些命令, 我們首先想到的,或許是將命令寫成shell腳本(shell script)。 不過,我們也可以寫成function, 然後在command line中打上function_name就可當一般的shell script使用了。
若只是你在shell中定義的function
,
除了用unset
function_name取消外,
一旦你退出shell, function也跟著消失。
然而,在script中使用function卻有許多好處,
除了提高整體script的執行性能外(因為已經載入),
還可以節省許多重複的代碼......
簡單而言,若你會將多個命令寫成script以供調用的話, 那你可以將function看成script中script。... ^_^
而且通過上一章節介紹的source
命令,
我們可以自行定義許許多多好用的function,
在集中寫在特定文件中,
然後,在其他的script中用source
將它們載入,並反覆執行。
若你是RedHat Linux
的使用者,
或許,已經猜出 /etc/rc.d/init.d/functions
這個文件時啥作用了~~~ ^_^
okay,說要輕鬆點的嘛,那這次就暫時寫到這吧。 祝大家學習愉快,^_^