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 ls
vez 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 ls
alias?
ls
executável em sua$PATH
variável de ambiente e precede o diretório (provavelmente/bin
) que contém ols
comando não-GNU ? Atualize sua pergunta para nos mostrar o valor real do seu$PATH
.xargs
executará o primeirols
comando encontrado em um diretório no seu$PATH
; não conhece aliases.Respostas:
O comando
xargs
só pode executar comandos, não aliases. O paralelo GNU, no entanto, é capaz de executar funções: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
gls
dependendo de como foi instalado no seu sistema) ou, se o seu shell permitir,Definindo
ls
como uma função (function ls { gls "$@"; }; export -f ls
no bash) e usando o GNU paralelo em vez do xargs (parallel -j1
se você quiser usar uma única CPU).fonte
bash
shell. Você pode usarxargs
com funções exportadas, bem como:ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
env_parallel
se 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.htmlA substituição do alias é feita pelo shell. Se o shell tentar chamar o comando
foo
e houver um aliasfoo=bar
, é o shell que substitui ofoo
bybar
aqui.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
ls
aqui não é executado pelo shell, mas um argumento paraxargs
. Portanto, o shell não o substitui.Em seguida , é
xargs
executadols
, 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.
fonte
alias xargs='xargs '
irá dizer ao shell para expandir os aliases depoisxargs
.