grep
私が私に多くの結果をもたらすことをやっているとしましょう。 grepの出力を使用して、ファイル名を最初の引数として使用するコマンドに渡したいと思います。たとえば -
myCommand filename.txt
私はこのようなことをしたい -
grep "xyz" | myCommand
しかし、myCommandはstdinから読み取られないため、パイプは機能しません。 grepの結果としてディスクに一時ファイルを作成したくありません。メモリなど、他の方法で「ファイル」を生成してmyCommand
使用できますか?
答え1
簡単な解決策は、次のようにBashのプロセス代替サポートを使用することです。
myCommand <(grep "xyz" somefile)
これはコマンドの出力をgrep
ファイルディスクリプタに接続してから/dev/fd/NNN
(NNN
fd番号はどこですか)、コマンドの入力ファイルに渡します(たとえば、コマンドは実際に実行できます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を使用します。