2016-06-07 54 views
1

我想運行兩個命令x和y,併爲這些命令定義一個環境變量V.有沒有一種簡單的方法在zsh中執行它? 「類似bash」的解決方案,即我可以在Zsh中爲子shell或複合命令設置一個環境變量嗎?

(export V=myvalue; x; y) 

是繁瑣的,只適用於子殼而不是化合物。但是,以下兩個版本在語法上無效:

V=myvalue (x ; y) # No! 
V=myvalue { x ; y } # No!No!No! 
+1

在'bash'至少,在'-k'選項允許你把環境調節劑的命令後,以及像之前一樣。 'zsh'允許你執行匿名函數。我試過'V = myvalue(){echo $ V; },這產生了一個解析錯誤,但我不知道是否(){echo $ V; }如果'zsh'與'bash'的'-k'選項等價,則V = myvalue'可能會工作。 – chepner

回答

2

如果沒有至少一些額外的代碼是不可能的。

通過預先分配變量賦值來修改環境僅適用於Simple Commands。這意味着變量賦值之後的第一個單詞必須是簡單的名稱(如「不復雜」)命令。複雜命令包括{ list }(list) contstructs。 (有關完整列表,請參閱documentation on Complex Commands

如果要修改命令的具體名單環境不改變當前的shell環境下,我能想到的兩種方式才達到該

  1. 正如在問題中提到有一個由運行過程中出現一個子shell並明確出口的變量,而直接的解決方案:

    (export V=myvalue; x; y) 
    
  2. 您可以使用eval避免創建一個子shell:

    V=myvalue eval "x; y" 
    V=myvalue eval x\; y 
    

    與第一個解決方案相比,這還節省了三到四個字符。主要缺點似乎是完成在eval的參數列表中不能很好地工作。

1

它有點長,但不是很多。你可以定義一個函數,然後立即把它作爲一個簡單的命令來調用。

f() { x; y; }; V=foo f 

或者,你可以做一個本地的出口有一個匿名函數:

() { local -x V=myvalue; x; y } 
+0

感謝您的選擇。帶有匿名函數的版本雖然看起來不太好,但至少會成爲一個選項,我真的想避免創建一個子shell .... – user1934428

相關問題