いくつかのコマンドの種類を知りたいです。 Linuxでxargs
の検索結果をfind
コマンドにパイプまたはtype
することは可能ですか?
例えば:
find . -name anacron | type
または
find . -name anacron | xargs type
type
は通常のコマンドではありません。シェルブイチンです。見る:
$ type type
type is a Shell builtin
そのため、bash
を-c
で呼び出して、目的を達成する必要があります
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
またはさらにシンプル(xargs
は不要):
$ find . -name anacron -exec bash -c "type {}" \;
bash -c "type ./file"
を呼び出し、すべてのファイルがfind
で検出されます。 -I
in xargs
は、後で使用するプレースホルダー{}
をここで定義することを意味します。このプレースホルダーは、見つかったファイル名に置き換えられます。
Shellビルトインがxargs
:で動作しない理由
[...]組み込みコマンドは、シェル自体に含まれています。組み込みコマンドの名前が単純なコマンドの最初のワードとして使用される場合、シェルは別のプログラムを呼び出さずにコマンドを直接実行します。 [...]
xargsは、標準入力[...]から項目を読み取り、コマンドを実行します
この場合のコマンドは単純な実行可能ファイルであり、組み込みのシェルは実行可能ファイルではありません。ファイルシステムに見つかりません。それはシェル自体の中にあります。そのため、シェルを呼び出して、呼び出されたシェルに組み込みコマンドを呼び出すように指示する必要があります。それがbash -c "command"
で起こったことです。
ここにはいくつかの問題があります(いくつかは既に強調表示されています):
type
は組み込みです。これは解決されたコマンドではなく、bash内の関数です。 man bash-builtins
を参照してください。これはbashのコンテキストでのみ機能するため、xargs
または-exec
分岐サブシェルでは機能しません。type
は、独自のパス検索に使用されます。パスを指定すると(find
はやらない)、おそらくそのパスを返すだけです。シンボリックリンクを解決しようとしている場合は、readlink -f
の方が良いかもしれません。一日中xargs readlink
または-exec readlink -f {} +
にパイプできます。それはあなたがしようとしていることをすることができないと言うことではありません。 2つのオプションがあります。 type
コマンドは一度に多くの名前を処理できるため、一度にすべての名前を指定できます。
type $(find /usr/sbin -name anacron)
多くのコマンドでは、引数が多すぎるとコマンドラインの長さの制限を超えてしまいます(getconf ARG_MAX
を参照)。ただし、type
はシェルに組み込まれ、新しいプロセスIDを生成しないため、この場合は適用されません(長さの制限はexec()通常のコマンドラインの子プロセス)。