xargsは私の「ls」エイリアスを使用しません。

xargsは私の「ls」エイリアスを使用しません。

AIXでは(ただし、これはHP-UXでも発生します)、私のパスにls

xargsを使用すると、エイリアスの代わりlsに標準のUnixを使用します。

たとえば、(flocateはトピックを検索するための正確なパスを見つける関数です):

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*

xargsがエイリアスを使用しないのはなぜですかls

答え1

このコマンドは、xargsエイリアスではなくコマンドのみを実行できます。ただし、GNU Parallel は次の機能を実行できます。

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

だから私は以下をお勧めします:

  • 使用したいlsバージョンのフルパス(またはglsシステムにインストールされている方法に応じて明示的な名前)をxargsに提供するか、シェルが許可する場合

  • ls関数として定義し(function ls { gls "$@"; }; export -f lsbashで)、xargsの代わりにGNU並列処理を使用します(parallel -j1単一のCPUを使用する場合)。

答え2

エイリアスの置換はシェルによって行われます。シェルがコマンド呼び出しを試み、fooエイリアスが存在する場合、foo=barシェルはfooここを置き換えますbar

シェルはコマンドに対してのみこれを行います。 (そうでなければ、エイリアスが指定されたコマンドと同じ引数も置き換えられます。)しかし、ここにあるものはlsシェルによって実行されるのではありませんxargs

次にxargs実行しますlsが、エイリアスがわからないため、パスで見つかった最初のエイリアスのみを実行します。

エイリアスはシェル内にあり、プログラムからエイリアスを読み取る標準化された方法はありません。

関連情報