
Я использую следующую команду, но безуспешно -
$ google-chrome <(grep "simple" SimpleDoc.txt)
Если я просто сделаю a 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