xargs no usa mi alias "ls"

8

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 lslugar del alias.

Por ejemplo ( flocatees 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 lsalias?

elbarna
fuente
1
¿Qué significa exactamente "Tengo GNU ls en mi camino"? ¿El directorio que contiene el GNU es lsejecutable en su $PATHvariable de entorno, y precede al directorio (probablemente /bin) que contiene el lscomando que no es GNU ? Actualice su pregunta para mostrarnos el valor real de su $PATH. xargsejecutará el primer ls comando que encuentre en un directorio en su $PATH; No sabe sobre alias.
Keith Thompson

Respuestas:

9

El comando xargssolo puede ejecutar comandos, no alias. GNU paralela, sin embargo, puede ejecutar funciones:

The command must be an executable, a script, a composed
command, or a function. If it is a function you need to export
-f the function first. An alias will, however, not work (see
why http://www.perlmonks.org/index.pl?node_id=484296).

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 glsdependiendo de cómo se instaló en su sistema) o, si su shell lo permite,

  • Definiéndolo lscomo una función ( function ls { gls "$@"; }; export -f lsen bash) y usando GNU paralelo en lugar de xargs ( parallel -j1si desea usar una sola CPU).

dhag
fuente
exportar funciones solo funciona con el bashshell. También puede usar xargscon funciones exportadas: ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
Stéphane Chazelas
Oh, buen truco, podría ser útil si uno se ve obligado a usar xargs.
dhag
Puede usarlo env_parallelsi 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.html
Ole Tange
3

La sustitución del alias es realizada por el shell. Si los intentos de shell de comandos para llamar foo, y hay un alias foo=bar, que es la cáscara que los sustitutos del foopor baraquí.

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 lsaquí no se ejecuta el shell, sino un argumento para xargs. Por lo tanto, el shell no lo reemplaza.

Luego se xargsejecuta ls, 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.

marinus
fuente
1
Tenga en cuenta que hacer alias xargs='xargs 'le dirá al shell que expanda los alias después xargs.
Stéphane Chazelas