Wie führt man Chrome über die Befehlszeile aus, indem man Prozesssubstitution verwendet?

Wie führt man Chrome über die Befehlszeile aus, indem man Prozesssubstitution verwendet?

Ich verwende den folgenden Befehl ohne Erfolg -

$ google-chrome <(grep "simple" SimpleDoc.txt)

Wenn ich einfach ein mache grep, bekomme ich -

$ grep "simple" SimpleDoc.txt
Very simple doc that contains plaintext. 

Ich habe auch ein Python-Skript geschrieben, showFileContents.pyum die Prozesssubstitution zu testen, und es funktioniert -

#! /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()

Hier ist die Ausgabe -

$ showFileContents.py <(grep "simple" SimpleDoc.txt)
Very simple doc that contains plaintext.

Aber wenn ich versuche, dasselbe zu tun mit

$ google-chrome <(grep "simple" SimpleDoc.txt)

das Browserfenster zeigt nichts an. Bei Firefox erhalte ich die Fehlermeldung „Firefox kann die Datei nicht finden“.

Warum passiert das und wie kann ich die Prozessersetzung mit Chrome nutzen?

Antwort1

Wenn Sie ausführen google-chrome, erkennt der Prozess, dass eine Instanz von Chrome geöffnet ist, und sendet ihr eine Nachricht, die Datei zu öffnen. Die Nachricht enthält den Dateinamen. Firefox funktioniert auf die gleiche Weise. Der von der Shell gestartete Prozess ist nicht der bereits laufende Browserprozess.

Die <(…)Konstruktion funktioniert, indem eine anonyme Pipe erstellt wird. Sie wird dem Befehl mit einem Namen wie übergeben /dev/fd/42, was „die Datei, die bereits auf Deskriptor 42 geöffnet ist“ bedeutet. Auf diese Datei kann nur von einem Prozess zugegriffen werden, der zur Ausführung Ihrer Befehlszeile gestartet wurde, nicht vom bereits laufenden Browserprozess.

Um die Daten an den laufenden Browserprozess zu übergeben, müssen die Daten in einer Datei mit einem Namen vorliegen, auf den beide Prozesse zugreifen können. Bei Firefox können Sie eine Named Pipe verwenden:

mkfifo f
grep "simple" SimpleDoc.txt >f &
firefox f
rm f

Chrome scheint nicht in der Lage zu sein, aus einer Pipe zu lesen, daher müssen Sie eine temporäre Datei erstellen. Sie können dies auch für Firefox tun.

In zsh erstellt die Variante der Prozessersetzung =()eine temporäre Datei.

google-chrome =(grep "simple" SimpleDoc.txt)

In Bash müssen Sie manuell eine temporäre Datei erstellen.

tmp=$(mktemp)
grep "simple" SimpleDoc.txt >$tmp
google-chrome "$tmp"
rm "$tmp"

Antwort2

Sie haben immer die Möglichkeit:

grep "simple" SimpleDoc.txt > delme.txt; google-chrome delme.txt

verwandte Informationen