En AIX (pero esto también sucede en HP-UX), tengo GNU ls en mi camino y también tiene el alias ls
.
Cuando uso xargs, en su lugar usa el Unix estándar en ls
lugar del alias.
Por ejemplo ( flocate
es una función que encuentra la ruta exacta del tema de búsqueda):
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*
¿Por qué los xargs no usan el ls
alias?
ls
ejecutable en su$PATH
variable de entorno, y precede al directorio (probablemente/bin
) que contiene ells
comando que no es GNU ? Actualice su pregunta para mostrarnos el valor real de su$PATH
.xargs
ejecutará el primerls
comando que encuentre en un directorio en su$PATH
; No sabe sobre alias.Respuestas:
El comando
xargs
solo puede ejecutar comandos, no alias. GNU paralela, sin embargo, puede ejecutar funciones:Entonces recomendaría:
Dando a xargs la ruta completa a la versión de ls que desea usar (o un nombre inequívoco, tal vez
gls
dependiendo de cómo se instaló en su sistema) o, si su shell lo permite,Definiéndolo
ls
como una función (function ls { gls "$@"; }; export -f ls
en bash) y usando GNU paralelo en lugar de xargs (parallel -j1
si desea usar una sola CPU).fuente
bash
shell. También puede usarxargs
con funciones exportadas:ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
env_parallel
si desea usar alias o no quiere exportar la función. Los alias son compatibles en: ash, bash, csh, dash, fish, ksh, mksh, pdksh, tcsh, zsh. Las funciones son compatibles en: bash, fish, ksh, mksh, pdksh, sh, zsh. Incluso funcionan si ejecuta comandos en servidores remotos. gnu.org/software/parallel/env_parallel.htmlLa sustitución del alias es realizada por el shell. Si los intentos de shell de comandos para llamar
foo
, y hay un aliasfoo=bar
, que es la cáscara que los sustitutos delfoo
porbar
aquí.El shell solo hace esto para los comandos. (De lo contrario, los argumentos que resultan ser los mismos que los de un comando con alias también se reemplazarían). Pero
ls
aquí no se ejecuta el shell, sino un argumento paraxargs
. Por lo tanto, el shell no lo reemplaza.Luego se
xargs
ejecutals
, pero no conoce los alias, por lo que solo ejecuta el primero que encuentra en la ruta.Los alias son internos al shell y no hay una forma estandarizada para que un programa los lea.
fuente
alias xargs='xargs '
le dirá al shell que expanda los alias despuésxargs
.