POSIX shell 中函數和變數的獨立命名空間

POSIX shell 中函數和變數的獨立命名空間

在 dash 中,函數和變數似乎位於不同的命名空間:

fn(){
    fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function

這是 dash 特定的功能還是 POSIX 保證?

答案1

一個保證:

2.9.5 功能定義指令

函數是使用者定義的名稱,用作簡單命令來呼叫具有新位置參數的複合命令。功能透過「功能定義命令」來定義。[...]

該函數名為fname;應用程式應確保它是一個名稱(請參閱 XBD 名稱)並且不是特殊內建實用程式的名稱。實作可以允許函數名稱中的其他字元作為副檔名。實作應為函數和變數維護單獨的名稱空間。

答案2

變數和函數駐留在破折號中的不同命名空間中,這也由POSIX:

實作應為函數和變數維護單獨的名稱空間。

除此之外,預設情況下,變數具有全域範圍。某些 shell(例如 bash、ksh 和 zsh)提供local關鍵字來聲明僅具有本地作用域的函數中的變數。

所以,是的,您所看到的行為是由 POSIX 保證的。

POSIX 還沒有標準化 local,然而:

早期提案中對函數的描述是基於函數應該像微型 shell 腳本一樣運行的概念;那是,除了共享變數,執行環境的大多數元素的行為應該像新的執行環境一樣,[..]

[..]函數內的局部變數被考慮並包含在另一個早期提案中(由特殊的內建函數控制local),但是被刪除因為它們不適合為函數開發的簡單模型,並且因為有人反對添加另一個不屬於歷史實踐的新的特殊內建函數。實作應保留標識符local(以及typesetKornShell 中使用的 ),以防該標準的未來版本採用此局部變數機制。

(強調我的)

相關內容