如果我從變數中刪除導出,還有什麼可以破壞的?
我的問題是,當我開始編寫腳本時,我遇到了幾個變數範圍問題,這導致了導出幾乎所有變數的壞習慣。
現在我的程式碼已經變得相當大,我正在考慮清理它,其中一部分是刪除一堆無用的導出。不幸的是,我不確定我對變數範圍的了解是否完整。即使在閱讀了有關該主題的幾頁之後。
我所知道的(希望是正確的):
1-導出變數使其內容可用於子shell程序:
export myvar="content"
2-像這樣在括號中完成的東西會受到刪除導出的影響(據我所知,這是聲明/使用子shell的唯一方法):
$(grep "content" <<< $myvar)
3-未設置範圍聲明的變數是全域變數:
myvar="content"
4-由於我沒有聲明任何局部變數,我不必擔心在我的函式中引起問題:
local myvar="i don't use this"
問題:
1-在我的程式碼旁邊刪除無用的導出是否有任何意義,而不是明顯的noobishness?
2-如果我繼續這樣做,還有什麼我應該注意的可能會受到影響並破壞我的程式碼的嗎?還是我的知識有誤/不完整?
3-如果你知道一個寫得很好的(和完整的)變數範圍參考,請分享連結。
只要您不使用
export
兩次評估,您就可以刪除所有導出而不會對導出的變數產生任何影響。通過兩次評估,我的意思是:var1=var2 export "${var1}=var3" echo "$var2" var3
相反,只需使用:
set -a
…在腳本的頂部。此後定義的所有變數都將自動進行
exported
- 其中包括您之前可能沒有export
編輯過的變數。或者,您可以只set -a
使用腳本的一部分,然後set +a
再取消設置它 - 它也可以作為函式工作。但是 subshells 無論如何都會自動繼承變數值,所以:
var1=value ( echo "$(echo "$var1")" ) value
export
在這種情況下沒有區別。但是,如果您的腳本呼叫另一個腳本或任何其他解釋您已
export
編輯的值的執行檔並且您停止export
它們,那麼這些值將不再在它們的環境中可用。在下面的範例中,我使用 shell 變數$PS1
(定義互動式 shell 提示的內容)來展示export
ed 變數的變化如何影響子程序。export PS1="$(printf "this is another executable\n > ")" echo exit | sh -i ###OUTPUT### this is another executable > exit exit
但 …
PS1="$(printf "this is another executable\n > ")" echo exit | sh -i ###OUTPUT### sh-4.3$ exit exit
但是話又說回來,如果您在呼叫程序時顯式聲明環境變數……
PS1="$(printf "this is another executable\n > ")" { echo exit | PS1=$PS1 sh -i echo exit | sh -i } ###OUTPUT### this is another executable > exit exit sh-4.3$ exit exit