為什麼更改腳本中的變數不會在腳本外更改它?

為什麼更改腳本中的變數不會在腳本外更改它?

假設我有export一個終端變數。之後,我呼叫一個腳本將該變數更改為其他值。但是當我返回終端和echo變數時,它仍保持其原始值。

如果我想要更改變數並在腳本外部可見,而不僅僅是在腳本中,我該怎麼辦劇本。這是我想說的一個例子:

ares@ares-HP-ProBook-4530s:~$ export package=tree
ares@ares-HP-ProBook-4530s:~$ cat script3.sh 

#! /bin/bash
#set -x
echo $package
apt-cache show $1 | head -1
if [ $? -eq 0 ]; then
    package=1
else
    package=0
fi
echo $package

運行腳本時的輸出

ares@ares-HP-ProBook-4530s:~$ ./script3.sh gnome-terminal
tree
Package: gnome-terminal
1
ares@ares-HP-ProBook-4530s:~$ echo $package
tree
ares@ares-HP-ProBook-4530s:~$ 

答案1

您的 shell 進程擁有父進程環境的副本,無法存取父進程的環境。當 shell 進程終止時,您對其環境所做的任何變更都會遺失。取得腳本檔案是配置 shell 環境最常用的方法,您可能只是想硬著頭皮為兩種 shell 風格中的每一種維護一個腳本檔案。

找到了這個答案這裡

答案2

來源yourfile.sh

這應該可以滿足需求。

答案3

另一種可能性是在 .bashrc 中建立一個函數,並在目前 shell 中呼叫該函數;這將節省一點打字時間。您仍然可以傳遞變數。

如果我需要更多的靈活性,這就是我使用的方法而不是別名。

答案4

新流程獲取複製每個導出的變數。

您需要執行以下操作之一:

  • 在同一進程上執行所有操作(透過在目前 shell 中取得腳本)
  • 將值保存在公共位置(sqlite、平面檔案)並從每個進程讀取/寫入它

相關內容