Unix: uma pergunta sobre xargs

8

No AIX (mas isso também acontece no HP-UX), tenho o GNU ls no meu caminho e também é aliado como ls .

Mas quando eu uso o xargs, ele usa o padrão Uns em vez do alias.

Por exemplo ( flocate é uma função que encontra o caminho exato de o assunto da pesquisa):

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 que os xargs não usam o ls alias?

    
por elbarna 29.04.2015 / 20:07

2 respostas

8

O comando xargs só é capaz de executar comandos, não aliases. O GNU paralelo, no entanto, é capaz de executar funções:

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).

Então, eu recomendo:

  • Dando aos xargs o caminho completo para a versão do ls que você deseja usar (ou um nome não ambíguo, talvez gls dependendo de como ele foi instalado em seu sistema) ou, se seu shell permitir,

  • Definindo ls como uma função ( function ls { gls "$@"; }; export -f ls no bash) e usando o GNU paralelo em vez de xargs ( parallel -j1 se você quiser usar uma única CPU).

por 29.04.2015 / 20:22
3

A substituição de alias é feita pelo shell. Se o shell tentar chamar o comando foo e houver um alias foo=bar , será o shell que substitui o foo por bar aqui.

O shell faz isso apenas para comandos. (Caso contrário, os argumentos que forem iguais a um comando com alias também seriam substituídos.) Mas seu ls aqui não é executado pelo shell, mas um argumento para xargs . Portanto, o shell não o substitui.

Em seguida, xargs executa ls , mas não sabe sobre os aliases, portanto, apenas executa o primeiro que encontrar no caminho.

Os aliases são internos ao shell e não há maneira padronizada de um programa lê-los.

    
por 29.04.2015 / 20:17

Tags