コマンドオプションでファイルから読み取ったデータの代わりにパイプから読み取ったデータを使用する

コマンドオプションでファイルから読み取ったデータの代わりにパイプから読み取ったデータを使用する

人が定義したように、このコマンドはファイルから入力を受け取ります。

$ command -r FILENAME

を使用して作成されたので、これがFILENAMEファイル名のリストを含むファイルであるとしますls > FILENAME

代わりに、結果をコマンドに直接提供するにはどうすればよいですかls?私が見るには、次のことが可能です。

$ ls | command -r

しかし、そうではありません。の出力はlsパラメータとしてリンクされていません。出力:

Usage: command -r FILENAME
error: -r option requires an argument

希望の効果をどのように取得できますか?

ベストアンサー1

コマンドによって異なります。ファイルから読み取るコマンドの中には、ファイルが事前に知られていて、どこからでも読み書きできる一般的なファイルであると予想しています。ファイルの内容がファイル名リストの場合、これは発生する可能性はありません。これにより、コマンドに次のものを含めることができます。管路最初から最後まで順次読み込まれます。ファイル名を必要とするコマンドにデータをパイプする方法はいくつかあります。

  • 多くのコマンドは、-それを読むことを意味する特別な名前として扱います。標準入力ファイルを開く代わりに。これは義務ではない契約です。

    ls | command -r -
    
  • /dev多くのUNIXバリアントは、標準記述子を指定する特別なファイルを提供します。存在する場合は/dev/stdin、標準入力から読み取るのと同じように開いて読み取られます/dev/fd/0

    ls | command -r /dev/stdin
    ls | command -r /dev/fd/0
    
  • シェルがksh、bash、またはzshの場合、シェルに特定のファイル記述子を割り当てる操作を処理させることができます。この方法の最大の利点は、標準入力に依存しないため、他の目的に標準入力を使用でき、複数回使用できることです。

    command -r <(ls)
    
  • コマンドが名前が特定の形式(通常は特定の拡張子)であると予想している場合は、シンボリックリンクを使用してだますことができます。

    ln -s /dev/fd/0 list.foo
    ls | command -r list.foo
    

    あるいは、名前付きパイプを使用することもできます。

    mkfifo list.foo
    ls >list.foo &
    command -r list.foo
    

気づくファイルリストの生成中にls問題が発生しました。ls印刷できない文字が含まれていると、ファイル名が破損する傾向があるためです。printf '%s\n' *より安定しています。ファイル名のすべてのバイトをそのまま印刷します。改行文字を含むファイル名はまだ問題を引き起こす可能性がありますが、コマンドに改行文字で区切られたファイル名のリストが必要な場合は避けられません。

おすすめ記事