2012-06-13 37 views
1

下面是一個例子:是否可以在子shell中修改父項的變量?

bash-4.2$ export i=0 
bash-4.2$ while :; do let i=i+1; done & 
[1] 29668 
bash-4.2$ echo $i 
0 
bash-4.2$ kill %1 
bash-4.2$ exit 

在這裏,我開始工作時不斷增加$i但只是作爲一個局部變量。我知道在bash中沒有指針或引用這樣的事情,所以我的問題是如何做到這一點?

如果可能以某種方式,那麼這意味着可以同時在多個線程中訪問和寫入一個變量,這就是我想要實現的。有沒有一種方法來防止內存讀/寫問題,如關鍵部分(在shell/bash中)?

回答

2

Bash 4支持coprocesses這只是一個使用雙向管道的幕後方法。

1

Bash沒有線程,進程不共享內存。子殼仍然是不同的過程 - 它們從父母繼承他們的狀態,但他們沒有共享數據。

父母可以讀取子shell或其他進程的輸出,然後更改自己的狀態,但是孩子無法直接這樣做。

+0

正如[here](http://www.gnu.org/software/bash/manual/bashref.html#Lists)所述,如果我用&符號結束命令,它會異步執行子shell中的命令。我問我是否可以創建一個父類和子類都可以編寫的全局變量,但似乎只能通過管道和其他代碼(coproc簡化它)。順便說一句,當我說線程我的意思是說每個進程都有線程時,並不一定要成爲同一進程的一部分。謝謝你的信息。 – user1238367

+0

Linux上的每個進程至少有一個線程,包括運行bash解釋器的進程。這並沒有改變bash無法產生多個線程的事實。 bash提供的唯一多處理形式是進程。 –

+0

對於子殼體你是對的 - 任何時候殼體都會從相同的開始執行環境中分離出一個子體,這是一個子殼體。但它仍然是一個子進程,適用相同的規則:無法修改父進程。 –

0

首先,這些不是線程,它們是進程。沒有直接的方法讓孩子更改父進程的變量(我知道的唯一方法是將C程序作爲調試器)。

更好地使用管道(可能是命名管道)將數據傳回給調用者。

相關問題