
Estoy usando el siguiente comando sin éxito:
$ google-chrome <(grep "simple" SimpleDoc.txt)
Si simplemente hago a grep
, obtengo...
$ grep "simple" SimpleDoc.txt
Very simple doc that contains plaintext.
También escribí un script en Python llamado showFileContents.py
para probar la sustitución de procesos y funciona:
#! /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()
Aquí está el resultado:
$ showFileContents.py <(grep "simple" SimpleDoc.txt)
Very simple doc that contains plaintext.
Pero cuando trato de hacer lo mismo con
$ google-chrome <(grep "simple" SimpleDoc.txt)
la ventana del navegador no muestra nada. Con Firefox, aparece un error que dice "Firefox no puede encontrar el archivo".
¿Por qué sucede esto y cómo puedo utilizar la sustitución de procesos con Chrome?
Respuesta1
Cuando ejecuta google-chrome
, el proceso detecta que hay una instancia abierta de Chrome y le envía un mensaje para abrir el archivo. El mensaje contiene el nombre del archivo. Firefox funciona de la misma manera. El proceso que se inicia desde el shell no es el proceso del navegador que ya se está ejecutando.
La <(…)
construcción funciona creando una tubería anónima. Se pasa al comando con un nombre como /dev/fd/42
, que significa "el archivo que ya está abierto en el descriptor 42". Solo se puede acceder a este archivo mediante un proceso que se inició para ejecutar su línea de comando, no mediante el proceso del navegador que ya se está ejecutando.
Para pasar los datos al proceso del navegador en ejecución, los datos deben estar en un archivo, con un nombre al que ambos procesos puedan acceder. Con Firefox, puedes usar una canalización con nombre:
mkfifo f
grep "simple" SimpleDoc.txt >f &
firefox f
rm f
Parece que Chrome no puede leer desde una tubería, por lo que debe crear un archivo temporal. También puedes hacer esto para Firefox.
En zsh, la construcción de sustitución de procesos variantes =()
crea un archivo temporal.
google-chrome =(grep "simple" SimpleDoc.txt)
En bash, debes crear un archivo temporal manualmente.
tmp=$(mktemp)
grep "simple" SimpleDoc.txt >$tmp
google-chrome "$tmp"
rm "$tmp"
Respuesta2
Bueno siempre tienes la opción de:
grep "simple" SimpleDoc.txt > delme.txt; google-chrome delme.txt