2017-10-18 16 views
0

Certaines commandes manipulent l'environnement d'une manière ou d'une autre, puis appellent une autre commande. Par exemple, xargs <command> <args> prend les arguments via l'entrée standard et les ajoute à la fin de la liste des arguments, puis exécute <command> avec ces arguments.Les alias zsh fonctionnent avec une commande préfixée

Séparément, je peux définir des alias dans ma configuration zsh. Par exemple,

alias ll='ls -al' 

signifie que je peux taper ll à la ligne de commande et ZSH développerai que pour ls -al.

Cependant, je ne peux pas utiliser les deux en combinaison. Si je vous écris echo Documents | xargs ll je reçois:

ll: command not found 

est-il un moyen de demander ZSH d'élargir alias après la commande en question? Par exemple. "Si la première commande est xargs, développez tout ce que vous verrez après."

Répondre

1

Vous pouvez définir un alias global:

alias -g ll='ls -al' 

Soyez conscient, cependant, que cela se développerait llpartout il se trouve comme un mot distinct, non seulement comme l'argument de commande aux commandes comme xargs.

0

Selon zsh manual

Chaque mot admissible à l'entrée de la coquille est vérifié pour voir s'il y a un alias défini pour elle. Si c'est le cas, il est remplacé par le texte de l'alias s'il est en position de commande (s'il peut être le premier mot d'une commande simple), ou si l'alias est global. Si le texte de remplacement se termine par un espace, le mot suivant dans l'entrée shell est toujours éligible aux fins de expansion d'alias. Un alias est défini à l'aide de l'alias builtin; Les alias globaux peuvent être définis à l'aide de l'option -g de ce composant.

alias Global est pas bon, puisque crénelage ll mondial echo ll sera élargi.

Votre première option est alias xargs='xargs ', l'espace supplémentaire provoquera l'expansion du mot suivant xargs.

Mais il y a toujours un problème. Par exemple, mv est souvent à nocorrect mv un alias, alors xargs mv se plaindra nocorrect: No such file or directory

Ma solution est d'utiliser l'extrait suivant pour en faire une fonction.

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] 
} 

Je me utilise le code ci-dessus pour développer sudo, watch, parallel, etc.