実際にコマンドである仮想ファイルを作成する


18

仮想ファイルを作成する方法はありますか。ファイルからの読み取りは実際にstdoutコマンドから読み取ります。ファイルへの書き込みstdinは、コマンドのacuallyへの書き込みですか?

これまでのところinotifywait、ファイルの変更時にコマンドを呼び出し、ファイルからの入力を取得してファイルに書き戻すことで、これを処理しています。

inotifywaitただし、常に再起動する必要はありません(常に実行していることを確認する必要があります)。このファイルはおそらく週に2回しか使用しません。

回答:


17

名前付きパイプを探しているかもしれません。

mkfifo f
{
  echo 'V cebqhpr bhgchg.'
  sleep 2
  echo 'Urer vf zber bhgchg.'
} >f
rot13 < f

パイプへの書き込みは、リスニングプログラムを開始しません。入力をループで処理する場合は、リスニングプログラムを実行し続ける必要があります。

while true; do rot13 <f >decoded-output-$(date +%s.%N); done

複数のプロセスが書き込まれている場合でも、パイプに書き込まれたすべてのデータがマージされることに注意してください。複数のプロセスが読み取り中の場合、1つだけがデータを取得します。そのため、パイプは同時状況には適さない場合があります。

名前付きソケットは同時接続を処理できますが、これは基本的なシェルスクリプトの機能を超えています。

規模の最も複雑な終わりにあるカスタムファイルシステムは、各ファイルシステムの設計と実装することができます、openwrite、などを、プログラム内の関数をトリガします。最小の投資は、例えばPythonでの数十行の非自明なコーディングです。ファイルの読み取り時にのみコマンドを実行する場合は、scriptfsまたはfusefltを使用できます。


3

名前付きパイプに関する注意事項:ファイルとは異なり、パイプは複数のリーダーを持つことはできません。その内容が読み取られると、消えます。そのため、ループする必要があります。つまり、コンテンツをライターからパイプに常にプッシュする必要があります。

私はこの質問に対する自分自身の答えを探していましたが、私が思いつくことができた他の唯一のものは、fuseに基づくscriptfsです。


1

あなたが記述するものは、本質的にFIFO特殊ファイルですfifo(7)。それらはによって作成されmkfifo(1)、プロセスはLinux for R / Wでそれらを開くことができます(すべてのUnixyシステムがそれを処理するわけではありません)。その後、2つの独立したプロセスがそれを使用して通信できます。


0

「実際にコマンドである仮想ファイルを作成する」最も簡単な方法は、FUSEファイルシステムを拡張することです。fusepyのようなライブラリを使用するのは非常に簡単です。

ここで例として、彼らは独自のLinuxマシン上に存在したかのようにあなたがHTTP / HTTPS / FTPのファイルを読み込むことができますFUSEファイルシステムの。同様に、読み取り時に同じコマンドを実行するものを作成できます。

ソースコードを見ると、50行のコードはほとんどありません(定型コードを除く)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.