Unix: eine Frage zu xargs

8

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 ( flocateist 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 lsAlias ​​nicht?

Elbarna
quelle
1
Was genau bedeutet "Ich habe GNU auf meinem Weg"? Befindet sich das Verzeichnis mit der lsausführbaren GNU- Datei in Ihrer $PATHUmgebungsvariablen und steht es (wahrscheinlich /bin) vor dem Verzeichnis, das den Nicht-GNU- lsBefehl enthält? Bitte aktualisieren Sie Ihre Frage, um uns den tatsächlichen Wert Ihrer zu zeigen $PATH. xargsführt den ersten ls Befehl aus, den es in einem Verzeichnis in Ihrem findet $PATH; es weiß nichts über Aliase.
Keith Thompson

Antworten:

9

Der Befehl kann xargsnur Befehle ausführen, keine Aliase. GNU parallel kann jedoch Funktionen ausführen:

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

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 glsabhängig davon, wie er auf Ihrem System installiert wurde) oder, wenn Ihre Shell dies zulässt,

  • Definieren lsals Funktion ( function ls { gls "$@"; }; export -f lsin Bash) und Verwenden von GNU parallel anstelle von xargs ( parallel -j1wenn Sie eine einzelne CPU verwenden möchten).

dhag
quelle
Das Exportieren von Funktionen funktioniert nur mit der bashShell. Sie können auch xargsmit exportierten Funktionen verwenden: ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
Stéphane Chazelas
Oh, netter Trick, es könnte nützlich sein, wenn man gezwungen ist, xargs zu verwenden.
Dhag
3

Die Alias-Ersetzung erfolgt durch die Shell. Wenn die Shell versucht Befehl zu nennen foo, und es ist ein Alias foo=bar, es ist die Schale , dass Ersatz des foovon barhier.

Die Shell tut dies nur für Befehle. (Andernfalls werden auch Argumente ersetzt, die mit einem Alias-Befehl identisch sind.) Ihr lsHere wird jedoch nicht von der Shell ausgeführt, sondern ein Argument für xargs. Daher ersetzt die Schale sie nicht.

Dann wird xargsausgeführt ls, 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.

Marinus
quelle
1
Beachten Sie, dass dies alias xargs='xargs 'die Shell anweist, Aliase nachher zu erweitern xargs.
Stéphane Chazelas