
我正在使用以下命令但沒有成功 -
$ 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 實例,並向其發送訊息以開啟該檔案。該訊息包含檔案名稱。火狐瀏覽器以同樣的方式運作。從 shell 啟動的進程不是已經執行的瀏覽器進程。
該<(…)
構造透過創建匿名管道來工作。它被傳遞給命令,其名稱類似於/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