我想運行兩個命令x和y,併爲這些命令定義一個環境變量V.有沒有一種簡單的方法在zsh中執行它? 「類似bash」的解決方案,即我可以在Zsh中爲子shell或複合命令設置一個環境變量嗎?
(export V=myvalue; x; y)
是繁瑣的,只適用於子殼而不是化合物。但是,以下兩個版本在語法上無效:
V=myvalue (x ; y) # No!
V=myvalue { x ; y } # No!No!No!
我想運行兩個命令x和y,併爲這些命令定義一個環境變量V.有沒有一種簡單的方法在zsh中執行它? 「類似bash」的解決方案,即我可以在Zsh中爲子shell或複合命令設置一個環境變量嗎?
(export V=myvalue; x; y)
是繁瑣的,只適用於子殼而不是化合物。但是,以下兩個版本在語法上無效:
V=myvalue (x ; y) # No!
V=myvalue { x ; y } # No!No!No!
如果沒有至少一些額外的代碼是不可能的。
通過預先分配變量賦值來修改環境僅適用於Simple Commands。這意味着變量賦值之後的第一個單詞必須是簡單的名稱(如「不復雜」)命令。複雜命令包括{ list }
和(list)
contstructs。 (有關完整列表,請參閱documentation on Complex Commands)
如果要修改命令的具體名單環境不改變當前的shell環境下,我能想到的兩種方式才達到該
正如在問題中提到有一個由運行過程中出現一個子shell並明確出口的變量,而直接的解決方案:
(export V=myvalue; x; y)
您可以使用eval
避免創建一個子shell:
V=myvalue eval "x; y"
V=myvalue eval x\; y
與第一個解決方案相比,這還節省了三到四個字符。主要缺點似乎是完成在eval
的參數列表中不能很好地工作。
它有點長,但不是很多。你可以定義一個函數,然後立即把它作爲一個簡單的命令來調用。
f() { x; y; }; V=foo f
或者,你可以做一個本地的出口有一個匿名函數:
() { local -x V=myvalue; x; y }
感謝您的選擇。帶有匿名函數的版本雖然看起來不太好,但至少會成爲一個選項,我真的想避免創建一個子shell .... – user1934428
在'bash'至少,在'-k'選項允許你把環境調節劑的命令後,以及像之前一樣。 'zsh'允許你執行匿名函數。我試過'V = myvalue(){echo $ V; },這產生了一個解析錯誤,但我不知道是否(){echo $ V; }如果'zsh'與'bash'的'-k'選項等價,則V = myvalue'可能會工作。 – chepner