請考慮以下代碼段:$ SOMEVAR=AAA$ echo zzz $SOMEVAR zzzzzz AAA zzz在這里,我將第一行設置$SOMEVAR為AAA-在第二行中回顯它時,AAA將按預期獲得內容。但是,如果我嘗試在與以下命令相同的命令行上指定變量echo:$ SOMEVAR=BBB echo zzz $SOMEVAR zzzzzz AAA zzz...我沒有得到BBB我期望的-我得到了舊值(AAA)。這是應該的樣子嗎?如果是這樣,那您怎么能指定like這樣的變量LD_PRELOAD=/... program args ...并使其起作用呢?我想念什么?
3 回答

慕的地6264312
TA貢獻1817條經驗 獲得超6個贊
您看到的是預期的行為。問題在于父外殼程序$SOMEVAR在使用修改后的環境調用命令之前會在命令行上求值。您需要獲得$SOMEVAR推遲評估,直到設置了環境。
您的直接選擇包括:
SOMEVAR=BBB eval echo zzz '$SOMEVAR' zzz。
SOMEVAR=BBB sh -c 'echo zzz $SOMEVAR zzz'。
兩者都使用單引號防止父外殼評估$SOMEVAR; 僅在環境中設置它之后(臨時,在單個命令的持續時間內)才對它進行評估。
另一個選擇是使用sub-shell表示法(也由Marcus Kuhn在他的答案中建議):
(SOMEVAR=BBB; echo zzz $SOMEVAR zzz)
該變量僅在子外殼中設置

浮云間
TA貢獻1829條經驗 獲得超4個贊
要實現您想要的,請使用
( SOMEVAR=BBB; echo zzz $SOMEVAR zzz )
原因:
您必須用分號或換行符將分配與下一個命令分開,否則在下一個命令(echo)發生參數擴展之前不會執行該分配。
您需要在子Shell環境中進行分配,以確保其不會在當前行之外持續存在。
該解決方案比其他建議的解決方案更短,更整潔且更有效,特別是它不會創建新的過程。
- 3 回答
- 0 關注
- 474 瀏覽
添加回答
舉報
0/150
提交
取消