簡體   English   中英

如何在將通過管道輸出的函數的bash上設置環境變量?

[英]How can I set an environment variable on bash on a function whose output will be piped?

我有一個類似於以下內容的bash腳本

func() {
  echo "func was called"
  var="right"
}

var="wrong"
func
echo $var

var="wrong"
func | tee file
echo $var

由於func()將var設置為“ right”,所以我希望echo可以兩次打印該字符串。 但是,我注意到,如果通過管道將函數的輸出重定向(而不是使用>重定向到文件),則不會設置環境變量。 在這種情況下,輸出為

right
func was called
wrong

為什么會這樣呢? 即使重定向了輸出,有什么方法可以讓該函數設置環境變量?

如果在管道中運行命令(即,用|分隔的一系列簡單命令),則該命令實際上是在子shell中執行的。 由於每個外殼程序都有其自己的環境變量,並且不同外殼程序中的變量之間沒有關系,因此無法持久化管道(在管道的任一側)中運行的命令的環境變量。

在許多情況下,您可以使用流程替換解決此問題。 例如:

func > >(tee file)

之所以發生這種情況,是因為在tee命令之前使用了管道,該命令創建了一個子外殼來執行命令。 您可以在子外殼程序本身中更改變量值,並且當子外殼程序退出時,您在父調用外殼程序中將獲得不變的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM