xargsが「ls」エイリアスを使用しない


8

AIXでは(ただし、これはHP-UXでも発生します)、パスにGNU lsがあり、エイリアスとしても使用され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
「パスにGNU lsがある」とはどういう意味ですか?ディレクトリは環境変数にGNU ls実行可能ファイルを含んでいますか?それは非GNU コマンドを含む$PATHディレクトリ(おそらく/bin)の前にありlsますか?質問を更新して、の実際の値を表示してください$PATH。あなたのディレクトリにxargsある最初の lsコマンドを実行します$PATH; エイリアスについては知りません。
キース・トンプソン

回答:


9

コマンド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).

だから私はどちらかをお勧めします:

  • xargsに、使用するlsのバージョンへの絶対パス(または、glsシステムへのインストール方法に応じて、明確な名前)を与えるか、シェルで許可されている場合は、

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


関数のエクスポートはbashシェルでのみ機能します。xargsエクスポートされた関数でも使用できます。 ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
StéphaneChazelas '29

ああ、いいトリックです。xargsを使わざるを得ない場合に役立ちます。
dhag 2015

env_parallelエイリアスを使用したい場合、または関数をエクスポートしたくない場合に使用できます。エイリアスは、ash、bash、csh、dash、fish、ksh、mksh、pdksh、tcsh、zshでサポートされています。関数は、bash、fish、ksh、mksh、pdksh、sh、zshでサポートされています。リモートサーバーでコマンドを実行しても機能します。gnu.org/software/parallel/env_parallel.html
Ole

3

エイリアスの置換はシェルによって行われます。シェルがcommandを呼び出そうとしfoo、エイリアスが存在する場合、ここでby foo=barを置き換えるのはシェルです。foobar

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

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

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


1
実行alias xargs='xargs 'すると、シェルにエイリアスを展開するように指示することに注意してくださいxargs
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.