回答:
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
xargs
{}
シェルビルトインが動作しない理由xargs
:
[...]組み込みコマンドはシェル自体に含まれています。組み込みコマンドの名前を単純なコマンドの最初の単語として使用すると、シェルは別のプログラムを呼び出さずにコマンドを直接実行します。[...]
xargsは標準入力[...]から項目を読み取り、コマンドを実行します
この場合のコマンドは単純な実行可能ファイルであり、組み込みのシェルは実行可能ファイルではありません。ファイルシステムで見つかりません。シェル自体の中にあります。したがって、シェルを呼び出して、呼び出されたシェルに組み込みコマンドを呼び出すように指示する必要があります。それがで起こったことbash -c "command"
です。
find ... -exec bash -c 'type "$@"' _ {} +
ここにはいくつかの問題があります(いくつかは既に強調表示されています):
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()関数に適用されます)。