首頁 > shell教程 閱讀:0更新時間:2020-03-28 02:19:12

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%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩