Bash
聲明變數時防止命令替換執行
所以我最近注意到,在使用命令替換聲明變數時,讓我們這樣說:
var=$(echo "this is running" > test; cat test)
然後它會執行(文件
test
將被創建),即使我還沒有(技術上)呼叫它,我希望這樣:var=$(echo "this is running" > test; cat test) echo "$var" # is where i would "normally" call the variable
在變數中聲明命令替換時,如何防止命令替換實際執行,因此它僅在我呼叫所述變數時實際執行?
PS:很清楚這是一個不好的例子,但它很好地證明了我的意思,儘管“無用使用 cat”和“無用使用 echo”……
聽起來您想要一個其內容是動態生成的變數。
bash
不支持ksh93 的學科,或 zsh 的動態命名目錄或 mksh 的值替換,這會使其更容易,但您可以使用這種 hack,使用 namerefs:var_generator() { date --iso-8601=ns; } var_history=() typeset -n var='var_history[ ${##${var_history[${#var_history[@]}]=$(var_generator)}},${#var_history[@]}-1 ]'
這裡
var
定義為對$var_history
數組元素的引用,使用數組索引動態評估並允許執行任意程式碼的事實(這裡用於執行var_generator
函式並將其輸出分配給數組的新元素)。然後:
bash-5.1$ echo "$var" 2021-03-23T13:36:43,243211696+00:00 bash-5.1$ echo "$var" 2021-03-23T13:36:45,517726619+00:00
儘管您可以在這裡使用,但這聽起來有點太複雜
$(var_generator)
了。但是,一個優點是您仍然可以執行諸如${var#pattern}
whilebash
(相反zsh
) won’t let you do 之類的事情${$(cmd)#pattern}
。