web-dev-qa-db-ja.com

「type」コマンドへの配管

いくつかのコマンドの種類を知りたいです。 Linuxでxargsの検索結果をfindコマンドにパイプまたはtypeすることは可能ですか?

例えば:

find . -name anacron | type

または

find . -name anacron | xargs type
10
LjinKazama

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"で起こったことです。

17
chaos

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

  • 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()通常のコマンドラインの子プロセス)。

11
Oli