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 ls
bashで)、xargsの代わりにGNU並列処理を使用します(parallel -j1
単一のCPUを使用する場合)。
答え2
エイリアスの置換はシェルによって行われます。シェルがコマンド呼び出しを試み、foo
エイリアスが存在する場合、foo=bar
シェルはfoo
ここを置き換えますbar
。
シェルはコマンドに対してのみこれを行います。 (そうでなければ、エイリアスが指定されたコマンドと同じ引数も置き換えられます。)しかし、ここにあるものはls
シェルによって実行されるのではありませんxargs
。
次にxargs
実行しますls
が、エイリアスがわからないため、パスで見つかった最初のエイリアスのみを実行します。
エイリアスはシェル内にあり、プログラムからエイリアスを読み取る標準化された方法はありません。