xargs não usa meu apelido "ls"

8

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

Quando uso xargs, ele usa o Unix padrão em lsvez do alias.

Por exemplo ( flocateé uma função que encontra o caminho exato do 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 o xargs não usa o lsalias?

elbarna
fonte
1
O que exatamente significa "Eu tenho GNU ls no meu caminho"? O diretório que contém o GNU lsexecutável em sua $PATHvariável de ambiente e precede o diretório (provavelmente /bin) que contém o lscomando não-GNU ? Atualize sua pergunta para nos mostrar o valor real do seu $PATH. xargsexecutará o primeiro ls comando encontrado em um diretório no seu $PATH; não conhece aliases.
21415 Keith Thompson

Respostas:

9

O comando xargssó pode executar comandos, não aliases. O paralelo GNU, 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 recomendaria:

  • Fornecendo ao xargs o caminho completo para a versão do ls que você deseja usar (ou um nome inequívoco, talvez glsdependendo de como foi instalado no seu sistema) ou, se o seu shell permitir,

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

dhag
fonte
As funções de exportação funcionam apenas com o bashshell. Você pode usar xargscom funções exportadas, bem como: ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
Stéphane Chazelas
Oh, bom truque, pode ser útil se alguém for forçado a usar xargs.
dhag
Você pode usar env_parallelse quiser usar aliases ou não quiser exportar a função. Aliases são suportados em: ash, bash, csh, dash, fish, ksh, mksh, pdksh, tcsh, zsh. As funções são suportadas em: bash, fish, ksh, mksh, pdksh, sh, zsh. Eles até funcionam se você executar comandos em servidores remotos. gnu.org/software/parallel/env_parallel.html
Ole Tange
3

A substituição do alias é feita pelo shell. Se o shell tentar chamar o comando fooe houver um alias foo=bar, é o shell que substitui o fooby baraqui.

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

Em seguida , é xargsexecutado ls, mas ele não conhece os aliases, portanto, apenas executa o primeiro encontrado no caminho.

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

marinus
fonte
1
Observe que fazer alias xargs='xargs 'irá dizer ao shell para expandir os aliases depois xargs.
Stéphane Chazelas