새 터미널을 생성하고, 일부 명령을 실행하고, 해당 출력을 원래 프로세스의 표준 입력으로 파이프하려고 합니다. 내가하려고하는 한 가지는 다음 bash 문장입니다.
$ xterm -e sh -c "echo -e 'foo\nbar' > /proc/$$/fd/1" | grep foo
그 안에 새 xterm 창을 생성하고 인쇄한 foo\nbar
후 이 명령을 실행하는 쉘의 표준 입력으로 리디렉션하려고 합니다. 작동하는지 확인하기 위해 grep
.
위의 코드는 단순히 print 대신 stdout으로 foo
인쇄 하지만 그 이유는 잘 모르겠습니다. 이 문제를 어떻게 해결할 수 있나요?bar
foo
편집: 이것의 실제 구현은 fzf를 사용하는 파일 선택기입니다.
#!/usr/bin/env bash
function open() {
# takes a bunch of file names (either passed as arguments or from stdin) and
# opens them
true
}
# This is what I have now
alacritty \
-e sh -c 'fzf -m --prompt="Open> " --border=horizontal --print0 \
| (nohup xargs -0 bash -c '\''open "$@"'\'' _ &>/dev/null &)'
# This is what I'm trying to do
# alacritty \
# -e sh -c "fzf -m --prompt='Open> ' --border=horizontal > /proc/$$/fd/1" \
# | open
답변1
파티에 조금 늦었지만 명명된 파이프(FIFO)를 사용하는 대신 fzf는 키 바인딩에 응답하여 외부 명령을 실행하는 기능도 제공합니다. 이것이 fzf를 파일 선택기로 사용하는 방법입니다.xdg-열기, 이는 대부분의 Linux 배포판에서 작동합니다):
fzf --bind "enter:execute(setsid xdg-open {} 2>/dev/null &)+abort"
터미널을 실행하여 위 작업의 일부 변형을 수행할 수 있습니다(예: 전역 키보드 단축키에서). 내 도트 파일에 스크립트가 있습니다파일을 열다그리고 하나는GUI 프로그램 시작gtk를 사용해 보세요. 몇 달 동안 별 문제 없이 사용해왔지만 gtk-launch는 어떤 이유에서인지 다시 시작한 후 항상 첫 번째 호출을 무시합니다.
어쨌든 나는 이것이 fifo나 파일 설명자를 다루는 것보다 더 간단하다는 것을 알았습니다.
답변2
#!/bin/sh
exec alacritty -e /bin/sh -c \
"exec fzf \"\$@\" < /proc/$$/fd/0 > /proc/$$/fd/1" \
-- "$@" 2>/dev/null