2017-10-18 21 views
0

某些命令以某種方式操縱環境,然後調用另一個命令。例如,xargs <command> <args>通過標準輸入接受參數並將它們附加到參數列表的末尾,然後使用這些參數運行<command>使zsh別名使用前綴命令工作

另外,我可以在我的zsh配置中定義別名。例如,

alias ll='ls -al' 

意味着我可以在命令行鍵入ll和ZSH將展開到ls -al

但是,我不能將兩者結合使用。如果我寫echo Documents | xargs ll我得到:

ll: command not found 

有沒有一種方法,以指導ZSH有問題的命令後擴大的別名?例如。 「如果第一個命令是xargs,那麼擴展你以後看到的其他東西。」

回答

1

你可以定義一個全局別名:

alias -g ll='ls -al' 

要知道,雖然,這將擴大ll任何地方發現作爲一個獨特的字,而非僅僅作爲命令的參數來像xargs命令。

0

根據zsh manual

在shell輸入每個符合條件的字進行檢查,看是否有針對它定義的別名。如果是這樣,如果它位於命令位置(如果它可能是簡單命令的第一個單詞),或者別名是全局的,則替換爲別名的文本。 如果替換文本以空格結尾,則外殼輸入中的下一個字始終符合別名擴展的用途。一個別名是使用別名builtin定義的; 全局別名可以使用該內建的-g選項來定義。

全局別名不好,因爲全局別名llecho ll將被展開。

您的第一個選擇是alias xargs='xargs ',額外的空間將導致擴展xargs後面的單詞。

但還是有問題。例如,mv經常混淆爲nocorrect mv,所以xargs mv會抱怨nocorrect: No such file or directory

我的解決方法是使用下面的代碼片段,使之成爲功能。

function alias_unwrapper { 
    local sudo="$1" 
    if [[ ! -x "$sudo" ]]; then 
     echo "$sudo not found"; return; 
    fi 
    local cmd=(${(s: :)aliases[$2]}); # let cmd be array of command and arguments 
    (($#cmd)) || cmd=($2)    # if cmd has no aliases, use array of a single element 
    while (($#cmd > 0)) && [[ $cmd[1] == "nocorrect" || $cmd[1] == "noglob" ]]; do 
     shift cmd;   # remove beginning garbage 
    done 
    local args=(${cmd:1}); # origin params of alias 
    args+=(${@:3})   # additional params after alias 
    $sudo ${cmd[1]} $args  # unwrap the args array 
} 


function xargs { 
    local XARGS=/usr/bin/xargs 
    alias_unwrapper $XARGS [email protected] 
} 

我自己使用上面的代碼,以擴大sudowatchparallel