從 bashrc 運行函數,但修改導出的變數

從 bashrc 運行函數,但修改導出的變數

我正在嘗試從 bashrc 運行一個函數,該函數每分鐘刷新一次並外部化變數。它看起來像這樣:

export CFN = ''
_some_fn
{
    export CFN = 'test'
    sleep 60
    _some_fn &
}
_some_fn &

其中「test」是一個變量,但是當我獲取它時,我無法從函數內部存取 CFN,我懷疑這是因為它在子 shell 中運行。有沒有辦法改變導出的CFN值?

答案1

這對於您當前的函數來說是不可能的,一旦您使用它作為背景,&它就會獲取進程堆疊的副本並離開。除非您明確建立該功能,否則對堆疊的變更無法傳播到作業的副本,並且同樣不可能將對函數堆疊的變更放入目前堆疊中。

您可以設定一些進程間通訊來更改變量,但這總是很棘手,而且我不確定您的用例是什麼。雙向 IPC 範例:

mkfifo -m 600 /var/tmp/cfn-to-fn
mkfifo -m 600 /var/tmp/cfn-from-fn
export CFN = ''
_some_fn
{
     read CFN < /var/tmp/cfn-to-fn
     # do something with the new CFN here
     echo 'processed data' >/var/tmp/cfn-from-fn
     _some_fn &
}
_some_fn &
echo 'processme' > /var/tmp/cfn-to-fn
cat /var/tmp/cfn-from-fn

mkfifo 有很多替代品,通常都在以下標籤下討論進程間通訊。如果您發現保持簡單的優點,請不要理會這些,只需將資料寫入一端的檔案並在另一端讀取它即可。 D-Bus 是大多數 UNIX 系統上的大型 IPC 總線,還有 TCP/ 或 UDP/IP(帶有netcatnc),但我還沒有看到太多使用這些的 shell 腳本。

最後的選擇是保留所有這些,讓腳本正常工作,而不將其作為後台作業運行,以便您可以在運行時調整環境。

相關內容