GNU/Linux >> Linux の 問題 >  >> Linux

複数の標準入力?どのように?

これは複数の標準入力ではありません。これは「プロセスの代用」と呼ばれるバッシュ主義ですhttp://tldp.org/LDP/abs/html/process-sub.html

疑似ファイル (/dev/fd/something) を作成します。 ) 置換ごとに。それはかなり便利です。このコマンドはストリームとしてのみ読み取ることができます。つまり、fseek で行ったり来たりすることはできません。パイプのように、バイトのストリームとして読み取る必要があります。

ボーナス回答

これを使用するために多くのことをする必要はありません。スクリプトに関する限り、コマンドラインで有効なファイル名を取得し、他のものと同じように open() できます。他の人が言ったように、 diff /dev/fd/XX /dev/fd/YY が表示されます .これらの疑似ファイルのいずれかで stat() を実行すると、それが名前付きパイプであることがわかります。パイプ セマンティクスで処理する必要があります。つまり、fseek() や ftell() は使用しません。ファイルかどうかを明示的に確認するために stat() テストを実行すると (例:[ -f $1 ] ) これはする break - 結局、これは名前付きパイプとして実装されます。


<(...) プロセス置換を行います バッシュで。括弧内のプロセスの出力は、通常の 3 を超える追加のファイル記述子に送信され、そのファイル記述子に対応するファイル名が返されます。このようにして、コマンドの出力を別のコマンドに渡すファイル名として扱うことができます。


stdin が 1 つあります と 1 つの stdout プロセスごと .通常は端末に接続されていますが、個別にリダイレクトできます。

この例では、2 つの wget があります。 関連するプロセスで、それぞれが独自の stdin を取得します と stdout .各 wget プロセスは - に書き込みます 、これはその stdout です .次に bash のプロセス置換 <(...) stdout を接続します diff から一意の疑似ファイルへのプロセスの 読める。 2 つのプロセス置換により、2 つの異なる疑似ファイルが生成されることに注意してください! したがって、diff 次のようなものが表示されます:

diff /dev/fd/XX /dev/fd/YY

stdout wget -q -O - URL1/dev/fd/XX に接続されています 、および stdout wget -q -O - URL2/dev/fd/YY へ .


Linux
  1. Linuxにvtopをインストールする方法

  2. Rsync プロセスをバックグラウンドで実行する方法

  3. バックグラウンドプロセスのプロセスIDを取得するには?

  1. 標準入力からsedを読み取るにはどうすればよいですか?

  2. ゾンビプロセスを強制終了する方法

  3. Python - Supervisor で標準出力をログに記録する方法 -

  1. プロセスへのポートを識別する方法は?

  2. プロセスの環境変数を読み取る方法

  3. fork() のコピーオンライトは複数のフォークをどのように処理しますか?