如何使用進程替換從命令列運行 chrome?

如何使用進程替換從命令列運行 chrome?

我正在使用以下命令但沒有成功 -

$ 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

相關內容