web-dev-qa-db-ja.com

パイプが猫と一緒に機能しないのはなぜですか?

私はこれを実行しようとしています:

locate pg_type.h | cat

しかし、このコマンドは単にpg_type.hを見つけることと同じです。

何を変更すればよいですか?やりたいcat pg_type.hどこでもpg_type.h 多分。

6
locate -e0 '*/pg_type.h' | xargs -r0 cat

locate pg_type.hは、パスにpg_type.hが含まれるすべてのファイルを検索します(たとえば、rpg_type.hornディレクトリがあった場合、そこにすべてのファイルが表示されることになります)。

-0がないと、locateの出力を後処理できません。これは、ファイルが改行文字で区切られている一方で、改行はファイル名で完全に有効な文字であるためです。

catは引数なしでstdoutに書き込み、stdinから読み取ったものを書き込むため、locate | catlocateと同じで、catlocateに沿って。必要なのは、ファイルのリストをargumentsとしてcatに渡すことです。

これがxargsの一般的な目的です。データのストリームを引数のリストに変換します。 -rは、入力がない場合にcatを呼び出さないことです。 -0がない場合(-rは標準ではありませんが、多くの実装で見られますが、少なくともxargsが何かに役立つ場合)、xargswords入力で引数に変換します。ここでwordsは空白で区切られ、バックスラッシュ、シングル、二重引用符はこれらの区切り文字をエスケープするために使用できるため、通常、locateがファイル名の表示に使用する形式ではありません。

そのため、locatexargsの両方に-0オプションを使用して、NUL文字(ファイルパスで使用できない唯一の文字)を使用してファイル名を区切ります。

また、locateは標準のコマンドではなく、バージョンやオプション、動作が異なる多数の実装が存在することにも注意してください。上記のコードは、少なくとも比較的最近のバージョンのGNU locateおよびmlocate実装)に適用されます。これらの実装は、少なくともLinuxベースのオペレーティングシステムで最も一般的です。

13

コマンドは、locateの出力を標準入力のcatに渡します。それはあなたが望むものではありません。 yoで必要なのは、locateの出力をcatargumentとして渡すことです。

これを行う方法はxargsを使用することだと思います。

locate pg_type.h | xargs cat
5