stdout
ファイルから読み込むことが実際にコマンドから読み取られるようにダミーファイルを作成する方法はありますかstdin
?
これまで、inotifywait
これをファイルが変更されたときにコマンドを呼び出し、ファイルから入力を受け取り、ファイルに書き換えるファイルの1つと組み合わせました。
私は何度も再起動するのが好きではありませんinotifywait
(そして常に実行する必要があります)。私はこのファイルを週に2回だけ使用します。
答え1
あなたは探しているかもしれません名前付きパイプ。
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つのプロセスだけがデータを取得します。したがって、パイプラインは同時状況に適していない可能性があります。
名前付きソケットは同時接続を処理できますが、これはデフォルトのシェルスクリプトの機能を超えています。
最も複雑な終わりはカスタムファイルシステムopen
、それぞれがwrite
プログラムで機能をトリガするファイルシステムを設計してインストールできます。最小限の投資は、数十行のマイナーなコーディングです。Python。ファイルの読み込み中にのみコマンドを実行するには、次のものを使用できます。スクリプトファイルシステムまたはヒューズ。
答え2
名前付きパイプに関する注意事項:ファイルとは異なり、パイプには複数のリーダーを含めることはできません。内容を読んだ後は消えます。したがって、ループが必要です。つまり、作成者のコンテンツをパイプラインに継続的にプッシュする必要があります。
私はこの質問に対する答えを自分で探していましたが、私が考えることができる唯一のことスクリプトファイルシステムこれは以下に基づいています。ヒューズ。
答え3
説明する内容は本質的にFIFO特殊ファイルですfifo(7)
。を参照してください。生成されたmkfifo(1)
次のプロセスは、Linuxで読み書きするためにそれを開くことができます(すべてのUnixyシステムがそれを処理できるわけではありません)。これにより、2つの独立したプロセスがそれを使用して通信できます。
答え4
質問があいまいです。 stdin/stdout はパイプ/ストリームです。ファイルはランダムにアクセスされます。つまり、ファイルにアクセスするときにオフセットが含まれ、stdin / stdoutを介してコマンドに渡す方法はありません。
アドレスのないパイプ/ストリーム動作が本当に必要な場合は、名前付きパイプを使用するか、「socat」を使用して仮想端末(pty)を設定します。その後、コマンドは相手の言葉を聞いて応答します。ただし、そのファイルにアクセスするすべての操作はシリアルデバイスで実行する必要があります。 Linux上のファイルパスがどのように単に「ストリーム/パイプ」でアクセスされるのかわかりません。たとえば、 "cat"コマンドは実際にプログラム的にファイルを開きますが、詳細はわかりませんが、アドレスが含まれているため、通常のファイルシステムファイルのように開かないようです。
ランダムアクセスが必要な場合は、NBD、NBDkit、libFUSE、BUSE、scriptfs、python-fuseを見てください。