Como ls não é invocado pelo seu shell no primeiro exemplo, o alias não funciona com xargs .
Aliases não são exportados para subshells, é por isso que o segundo exemplo falha.
Como os aliases são avaliados depois que uma linha é lida, você não pode, por exemplo, foo=$( alias ls='ls -l' ; ls ) .
Para obter o efeito desejado apenas em bash , você pode usar funções, por exemplo,
function ls { /bin/ls -F "$@" ; }
você pode adicioná-los a subshells como este para que funcione:
ret=$( function ls { /bin/ls -l "$@" ; } ; ls )
A solução adequada para que funcione em todos os locais onde qualquer programa executa ls , coloque um script chamado ls antes do ls real na pesquisa $PATH que chama o% realls com% co_de parâmetro%.
#!/bin/bash
/bin/ls -F "$@"
Salvar como -F e /usr/local/bin/ls .
Esteja ciente dos programas que usam export $PATH=/usr/local/bin:$PATH codificados e dos programas que analisam a saída de /bin/ls e falharão quando o formato for diferente do esperado.