「タイプ」コマンドへの配管


10

いくつかのコマンドの種類を知りたい。それは、パイプまたはすることが可能であるxargsから、検索結果findtype、Linuxでのコマンド?

例えば:

find . -name anacron | type

または

find . -name anacron | xargs type

オリの答えが一番いいと思います。カオスの答えはうまくいきますが、オリの答えは賢いです。
Helio

回答:


17

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ます。手段、ここでは、プレースホルダを定義後で使用するために。このプレースホルダーは、見つかったファイル名に置き換えられます。-Ixargs{}

シェルビルトインが動作しない理由xargs

[...]組み込みコマンドはシェル自体に含まれています。組み込みコマンドの名前を単純なコマンドの最初の単語として使用すると、シェルは別のプログラムを呼び出さずにコマンドを直接実行します。[...]


xargsは標準入力[...]から項目を読み取り、コマンドを実行します

この場合のコマンドは単純な実行可能ファイルであり、組み込みのシェルは実行可能ファイルではありません。ファイルシステムで見つかりません。シェル自体の中にあります。したがって、シェルを呼び出して、呼び出されたシェルに組み込みコマンドを呼び出すように指示する必要があります。それがで起こったことbash -c "command"です。


3
あなたはそれを凝縮することができますfind ... -exec bash -c 'type "$@"' _ {} +
muru

2
@muru確かに、私は自分の答えをもう一度読んで、それを見た=)
chaos

11

ここにはいくつかの問題があります(いくつかは既に強調表示されています):

  • 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()関数に適用されます)。


1
オリありがとう!このLinux初心者は、「タイプ」とその動作について、今日何か新しいことを学びました。
LjinKazama
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.