実際にファイルをディスクに保存せずに、すべてのプロセスで使用できる「ファイル」を作成できますか?

実際にファイルをディスクに保存せずに、すべてのプロセスで使用できる「ファイル」を作成できますか?

grep私が私に多くの結果をもたらすことをやっているとしましょう。 grepの出力を使用して、ファイル名を最初の引数として使用するコマンドに渡したいと思います。たとえば -

myCommand filename.txt

私はこのようなことをしたい -

grep "xyz" | myCommand

しかし、myCommandはstdinから読み取られないため、パイプは機能しません。 grepの結果としてディスクに一時ファイルを作成したくありません。メモリなど、他の方法で「ファイル」を生成してmyCommand使用できますか?

答え1

簡単な解決策は、次のようにBashのプロセス代替サポートを使用することです。

myCommand <(grep "xyz" somefile)

これはコマンドの出力をgrepファイルディスクリプタに接続してから/dev/fd/NNNNNNfd番号はどこですか)、コマンドの入力ファイルに渡します(たとえば、コマンドは実際に実行できますmyCommand /dev/fd/63)。このソリューション確かに一時ファイルを作成します。

名前付きパイプを作成し、それを使用してデータを転送することもできます。

$ mkfifo /tmp/myfifo
$ grep "xyz somefile > /tmp/myfifo &
$ myCommand /tmp/myfifo

しかし、実際には、最初の解決策はより簡単です。

スティーブン・チャゼラスは次のように語っています。

zshには、通常の一時ファイルを使用するmyCommand =(grep xyz somefile)もあります(myCommandがパイプを許可できない場合)。

一部のコマンドは、パイプには適用されない入力ファイルへのランダムアクセスを実行できると予想しているため、これは重要です。この構文を使用すると、直接クリーンアップすることなく一時ファイルの利点を享受できます。

答え2

現在、ほとんどのディストリビューションはこの目的のためにRAMディスクを含みます。通常どおりにファイルを作成し、通常は次/dev/shmのようにファイルがあるかどうかを確認できます。

$ mount |grep shm
tmpfs on /dev/shm type tmpfs (rw)

もしあれば他のファイルシステムのように書くことができます:

$ echo "hello world" > /dev/shm/somefile.txt

一般的なツールを使用して確認してください。

$ ls -l /dev/shm/
total 680
-r-------- 1 saml saml 67108904 Jul 22 20:55 pulse-shm-3981461026
-r-------- 1 saml saml 67108904 Jul 18 18:06 pulse-shm-799251885
-rw-rw-r-- 1 saml saml       12 Jul 24 10:59 somefile.txt

ただし、これは物理ディスク領域を消費せずにRAMを使用します。

関連情報