Shell-Script

如果我從變數中刪除導出,還有什麼可以破壞的?

  • September 9, 2016

我的問題是,當我開始編寫腳本時,我遇到了幾個變數範圍問題,這導致了導出幾乎所有變數的壞習慣。

現在我的程式碼已經變得相當大,我正在考慮清理它,其中一部分是刪除一堆無用的導出。不幸的是,我不確定我對變數範圍的了解是否完整。即使在閱讀了有關該主題的幾頁之後。

我所知道的(希望是正確的):

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再取消設置它 - 它也可以作為函式工作。

但是 subshel​​ls 無論如何都會自動繼承變數值,所以:

var1=value
( echo "$(echo "$var1")" )
value

export在這種情況下沒有區別。

但是,如果您的腳本呼叫另一個腳本或任何其他解釋您已export編輯的值的執行檔並且您停止export它們,那麼這些值將不再在它們的環境中可用。在下面的範例中,我使用 shell 變數$PS1(定義互動式 shell 提示的內容)來展示exported 變數的變化如何影響子程序。

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

引用自:https://unix.stackexchange.com/questions/137638