나는 성공하지 않고 다음 명령을 사용하고 있습니다 -
$ 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에서 파일을 찾을 수 없습니다."라는 오류 메시지가 나타납니다.
왜 이런 일이 발생하며 크롬을 사용하여 프로세스 교체를 수행하는 방법은 무엇입니까?
답변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