
次のコマンドを使用していますが、成功しません -
$ google-chrome <(grep "simple" SimpleDoc.txt)
単純に を実行すると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"
答え2
まあ、常に次のオプションがあります:
grep "simple" SimpleDoc.txt > delme.txt; google-chrome delme.txt