xargs non usa il mio alias "ls"


8

Su AIX (ma questo accade anche su HP-UX), ho GNU ls nel mio percorso ed è anche alias ls.

Quando uso xargs, usa invece lo standard Unix lsinvece dell'alias.

Ad esempio ( flocateè una funzione che trova il percorso esatto dell'oggetto di ricerca):

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*

Perché xargs non usa l' lsalias?


1
Cosa significa esattamente "Ho GNU ls nel mio percorso"? La directory che contiene l' lseseguibile GNU nella $PATHvariabile di ambiente e precede la directory (probabilmente /bin) che contiene il lscomando non GNU ? Aggiorna la tua domanda per mostrarci il valore reale del tuo $PATH. xargseseguirà il primo ls comando che trova in una directory nella tua $PATH; non conosce gli alias.
Keith Thompson,

Risposte:


9

Il comando xargsè solo in grado di eseguire comandi, non alias. GNU parallel, tuttavia, è in grado di eseguire funzioni:

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

Quindi consiglierei:

  • Dare a xargs il percorso completo della versione di ls che si desidera utilizzare (o un nome non ambiguo, forse a glsseconda di come è stato installato sul sistema) o, se la shell lo consente,

  • Definire lscome funzione ( function ls { gls "$@"; }; export -f lsin bash) e usare GNU parallelo invece di xargs ( parallel -j1se si desidera utilizzare una singola CPU).


le funzioni di esportazione funzionano solo con la bashshell. È possibile utilizzare anche xargscon le funzioni esportate: ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
Stéphane Chazelas,

Oh, bel trucco, potrebbe essere utile se si è costretti a usare xargs.
Dhag,

È possibile utilizzare env_parallelse si desidera utilizzare gli alias o non si desidera esportare la funzione. Gli alias sono supportati in: ash, bash, csh, dash, fish, ksh, mksh, pdksh, tcsh, zsh. Le funzioni sono supportate in: bash, fish, ksh, mksh, pdksh, sh, zsh. Funzionano anche se si eseguono comandi su server remoti. gnu.org/software/parallel/env_parallel.html
Ole Tange,

3

La sostituzione alias viene eseguita dalla shell. Se i tentativi di shell per chiamare il comando foo, e non v'è un alias foo=bar, è il guscio che sostituisce il fooda barqui.

La shell lo fa solo per i comandi. (Altrimenti, anche gli argomenti che risultano essere gli stessi di un comando con alias verrebbero sostituiti.) Ma il tuo lsqui non è gestito dalla shell, ma un argomento per xargs. Pertanto, la shell non lo sostituisce.

Quindi xargsviene eseguito ls, ma non conosce gli alias, quindi esegue solo il primo che trova nel percorso.

Gli alias sono interni alla shell e non esiste un modo standard per un programma per leggerli.


1
Nota che fare alias xargs='xargs 'dirà alla shell di espandere gli alias dopo xargs.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.