Bash
腳本函式呼叫:function vs $(function)
為簡單起見,請參考以下程式碼
#!/bin/bash number=7 function doSomething() { number=8 } doSomething echo "$number"
它列印
8
。但是有:
#!/bin/bash number=7 function doSomething() { number=8 } $(doSomething) echo "$number"
它列印
7
。我有以下問題:
- 每一個的技術名稱是什麼?,我的意思是
functioncall
和$(functioncall)
- 每種方法如何工作?似乎前者考慮(影響)函式本身之外的變數,後者不考慮
- 何時強制使用一種方法而不是另一種方法(主要是關於性能問題 - 當然 - 如果有的話),如果有其他原因,他們是受歡迎的。
您正在體驗命令替換的微妙之處。
通話
doSomething
是一個簡單的函式呼叫。它執行該函式,就像您將函式的命令複製並粘貼到您呼叫它的位置一樣。因此,它
number
用新值覆蓋變數8
。通話
$(doSomething)
另一方面是命令替換。它旨在執行函式並返回列印到的任何函式
stdout
。它通常不是“獨立”使用,而是用於變數賦值,例如,os_type=$(uname)
這將執行命令
uname
,在 Linux 系統上該命令將列印Linux
到控制台,並將其結果儲存到 shell 變數os_type
。因此,將命令替換與不輸出任何內容的命令或函式(例如您的doSomething
. 實際上,由於替換$(doSomething)
基本上是 的輸出的佔位符,doSomething
因此您沒有收到腳本錯誤的唯一原因是您的函式沒有輸出任何內容。如果你說,例如,$(uname)
代替
$(doSomething)
你的 shell 會嘗試執行命令
Linux
並生成一個Linux: No such file or directory
錯誤(1)。
理解您觀察到的效果的關鍵點是,在命令替換中,命令在子shell 中執行,即對變數所做的任何更改都不會反向傳播到執行主腳本的shell。因此,雖然它在內部執行 的命令
doSomething
並將一個變數設置number
為無法修改您在主腳本中使用的變數。8``stdout``number
如需進一步閱讀,您可能需要查看
在這個網站上,或
了解更多概覽。
(1)另一方面,這意味著您可以使用命令替換來執行一個您在編寫腳本時不知道其名稱的命令,但是您可以通過執行另一個您知道的命令來查找該命令。