Sur AIX (mais cela se produit également sur HP-UX), j'ai des GNU ls sur mon chemin et il est également alias comme ls
.
Lorsque j'utilise xargs, il utilise à la ls
place l' Unix standard au lieu de l'alias.
Par exemple ( flocate
est une fonction qui trouve le chemin exact du sujet de recherche):
flocate mirrorvg | xargs ls -lh
ls: illegal option -- h
usage: ls [-1ACFHLNRSabcdefgiklmnopqrstuxEUX] [File...]
ls -lh /usr/sbin/mirrorvg
-r-xr-x--- 1 root system 37K apr 3 2014 /usr/sbin/mirrorvg*
Pourquoi xargs n'utilise-t-il pas l' ls
alias?
ls
exécutable GNU se trouve-t-il dans votre$PATH
variable d'environnement et précède-t-il (probablement/bin
) le répertoire contenant lals
commande non GNU ? Veuillez mettre à jour votre question pour nous montrer la valeur réelle de votre$PATH
.xargs
exécutera la premièrels
commande qu'il trouve dans un répertoire de votre$PATH
; il ne connaît pas les alias.Réponses:
La commande
xargs
ne peut exécuter que des commandes, pas des alias. Cependant, GNU Parallel est capable d'exécuter des fonctions:Je recommanderais donc soit:
Donner à xargs le chemin complet de la version de ls que vous souhaitez utiliser (ou un nom non ambigu, peut-être en
gls
fonction de la façon dont il a été installé sur votre système) ou, si votre shell le permet,Définition en
ls
tant que fonction (function ls { gls "$@"; }; export -f ls
en bash) et utilisation de GNU parallel au lieu de xargs (parallel -j1
si vous souhaitez utiliser un seul CPU).la source
bash
shell. Vous pouvez également utiliserxargs
avec les fonctions exportées:ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
env_parallel
si vous souhaitez utiliser des alias ou ne souhaitez pas exporter la fonction. Les alias sont pris en charge dans: ash, bash, csh, dash, fish, ksh, mksh, pdksh, tcsh, zsh. Les fonctions sont prises en charge dans: bash, fish, ksh, mksh, pdksh, sh, zsh. Ils fonctionnent même si vous exécutez des commandes sur des serveurs distants. gnu.org/software/parallel/env_parallel.htmlLa substitution d'alias est effectuée par le shell. Si le shell essaie d'appeler la commande
foo
et qu'il y a un aliasfoo=bar
, c'est le shell qui remplace lefoo
parbar
ici.Le shell ne fait cela que pour les commandes. (Sinon, les arguments qui se trouvent être identiques à une commande aliasée seraient également remplacés.) Mais votre
ls
ici n'est pas exécuté par le shell, mais un argument pourxargs
. Par conséquent, le shell ne le remplace pas.xargs
S'exécute ensuitels
, mais il ne connaît pas les alias, il exécute donc le premier qu'il trouve dans le chemin.Les alias sont internes au shell et il n'existe aucun moyen standardisé pour un programme de les lire.
la source
alias xargs='xargs '
indiquera au shell de développer les alias aprèsxargs
.