私は成功せず、次のコマンドを使用しています -
$ google-chrome <(grep "simple" SimpleDoc.txt)
1つだけ実行すると、grep
次のような結果が得られます。
$ grep "simple" SimpleDoc.txt
Very simple doc that contains plaintext.
また、テストプロセスの置き換えと呼ばれるPythonスクリプトを作成しましたが、うまくいきますshowFileContents.py
。
#! /usr/bin/python
import sys
arg1 = sys.argv[1]
f = open(arg1)
line = f.readline()
while line:
sys.stdout.write(line)
line = f.readline()
f.close()
これは出力です -
$ showFileContents.py <(grep "simple" SimpleDoc.txt)
Very simple doc that contains plaintext.
しかし、同じことをしようとすると
$ google-chrome <(grep "simple" SimpleDoc.txt)
ブラウザウィンドウには何も表示されません。 Firefoxを使用すると、「Firefoxでファイルが見つかりません」というエラーメッセージが表示されます。
なぜこれが起こり、Chromeを使用してプロセス交換を実行するのですか?
ベストアンサー1
これを実行すると、google-chrome
プロセスは開いているChromeインスタンスがあることを検出し、ファイルを開くように求めます。メッセージにはファイル名が含まれています。 Firefoxも同じように動作します。シェルで開始されたプロセスは、すでに実行されているブラウザプロセスではありません。
この<(…)
構成は、匿名パイプを生成することによって機能します。これは/dev/fd/42
、「ファイルがすでに記述子42で開いている」と同様の名前のコマンドに渡されます。このファイルは、すでに実行されているブラウザプロセスではなく、コマンドラインを実行するために開始されたプロセスからのみアクセスできます。
実行中のブラウザプロセスにデータを渡すには、両方のプロセスがアクセスできる名前のファイルにデータが必要です。 Firefoxでは、名前付きパイプを使用できます。
mkfifo f
grep "simple" SimpleDoc.txt >f &
firefox f
rm f
Chromeがパイプからデータを読み取れないようであるため、一時ファイルを作成する必要があります。 Firefoxでもこれを行うことができます。
zsh では、バリアント・プロセスの代替構成は=()
一時ファイルを生成します。
google-chrome =(grep "simple" SimpleDoc.txt)
Bashでは一時ファイルを手動で生成する必要があります。
tmp=$(mktemp)
grep "simple" SimpleDoc.txt >$tmp
google-chrome "$tmp"
rm "$tmp"