Shell組命令(把多條命令看做一個整體)
所謂組命令,就是將多個命令劃分為一組,或者看成一個整體。
shell 組命令的寫法有兩種:
{ command1; command2; command3; . . . }
(command1; command2; command3;. . . )
兩種寫法的區別在于:由花括號{}
包圍起來的組命名在當前 Shell 進程中執行,而由小括號()
包圍起來的組命令會創建一個子 Shell,所有命令都在子 Shell 中執行。
對于第一種寫法,花括號和命令之間必須有一個空格,并且最后一個命令必須用一個分號或者一個換行符結束。
子 Shell 就是一個子進程,是通過當前 Shell 進程創建的一個新進程。但是子 Shell 和一般的子進程(比如bash ./test.sh
創建的子進程)還是有差別的,我們將在《子Shell和子進程》一節中深入講解,讀者暫時把子 Shell 和子進程等價起來就行。
組命令可以將多條命令的輸出結果合并在一起,在使用重定向和管道時會特別方便。
例如,下面的代碼將多個命令的輸出重定向到 out.txt:
ls -l > out.txt #>表示覆蓋 echo "http://www.beylze.com/d/file/20190908/vvtxomnk1w5.html >> out.txt #>>表示追加 cat readme.txt >> out.txt
本段代碼共使用了三次重定向。
借助組命令,我們可以將以上三條命令合并在一起,簡化成一次重定向:
{ ls -l; echo "http://www.beylze.com/d/file/20190908/vvtxomnk1w5.html; cat readme.txt; } > out.txt
或者寫作:
(ls -l; echo "http://www.beylze.com/d/file/20190908/vvtxomnk1w5.html; cat readme.txt) > out.txt
使用組命令技術,我們節省了一些打字時間。
類似的道理,我們也可以將組命令和管道結合起來:
{ ls -l; echo "http://www.beylze.com/d/file/20190908/vvtxomnk1w5.html; cat readme.txt; } | lpr
這里我們把三個命令的輸出結果合并在一起,并把它們用管道輸送給命令 lpr 的輸入,以便產生一個打印報告。
兩種組命令形式的對比
雖然兩種 Shell 組命令形式看起來相似,它們都能用在重定向中合并輸出結果,但兩者之間有一個很重要的不同:由{}
包圍的組命令在當前 Shell 進程中執行,由()
包圍的組命令會創建一個子Shell,所有命令都會在這個子 Shell 中執行。
在子 Shell 中執行意味著,運行環境被復制給了一個新的 shell 進程,當這個子 Shell 退出時,新的進程也會被銷毀,環境副本也會消失,所以在子 Shell 環境中的任何更改都會消失(包括給變量賦值)。因此,在大多數情況下,除非腳本要求一個子 Shell,否則使用{}
比使用()
更受歡迎,并且{}
的進行速度更快,占用的內存更少。
beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。
通俗易懂,深入淺出,一篇文章只講一個知識點。
文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。
文章不涉及代碼,不燒腦細胞,人人都可以學習。
當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!