Unter AIX (aber dies passiert auch unter HP-UX) habe ich GNUs in meinem Pfad und es ist auch als Alias gekennzeichnet ls
.
Aber wenn ich xargs benutze, verwendet es das Standard-Unix ls anstelle des Alias.
Zum Beispiel ( flocate
ist eine Funktion, die den genauen Pfad des Suchobjekts findet):
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*
Warum verwendet xargs den ls
Alias nicht?
ls
ausführbaren GNU- Datei in Ihrer$PATH
Umgebungsvariablen und steht es (wahrscheinlich/bin
) vor dem Verzeichnis, das den Nicht-GNU-ls
Befehl enthält? Bitte aktualisieren Sie Ihre Frage, um uns den tatsächlichen Wert Ihrer zu zeigen$PATH
.xargs
führt den erstenls
Befehl aus, den es in einem Verzeichnis in Ihrem findet$PATH
; es weiß nichts über Aliase.Antworten:
Der Befehl kann
xargs
nur Befehle ausführen, keine Aliase. GNU parallel kann jedoch Funktionen ausführen:Also würde ich entweder empfehlen:
Geben Sie xargs den vollständigen Pfad zu der Version von ls, die Sie verwenden möchten (oder einen eindeutigen Namen, möglicherweise
gls
abhängig davon, wie er auf Ihrem System installiert wurde) oder, wenn Ihre Shell dies zulässt,Definieren
ls
als Funktion (function ls { gls "$@"; }; export -f ls
in Bash) und Verwenden von GNU parallel anstelle von xargs (parallel -j1
wenn Sie eine einzelne CPU verwenden möchten).quelle
bash
Shell. Sie können auchxargs
mit exportierten Funktionen verwenden:ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
Die Alias-Ersetzung erfolgt durch die Shell. Wenn die Shell versucht Befehl zu nennen
foo
, und es ist ein Aliasfoo=bar
, es ist die Schale , dass Ersatz desfoo
vonbar
hier.Die Shell tut dies nur für Befehle. (Andernfalls werden auch Argumente ersetzt, die mit einem Alias-Befehl identisch sind.) Ihr
ls
Here wird jedoch nicht von der Shell ausgeführt, sondern ein Argument fürxargs
. Daher ersetzt die Schale sie nicht.Dann wird
xargs
ausgeführtls
, aber es kennt die Aliase nicht, so dass es nur den ersten ausführt , den es im Pfad findet.Die Aliase befinden sich innerhalb der Shell und es gibt keine standardisierte Möglichkeit für ein Programm, sie auszulesen.
quelle
alias xargs='xargs '
die Shell anweist, Aliase nachher zu erweiternxargs
.