스크립트의 표준 입력을 생성된 alacritty 인스턴스에서 명령의 표준 입력으로 전달하기 위해 백그라운드에서 파일로 리디렉션을 시도했습니다(명령이 이를 읽을 수 있도록).
t="$(mktemp --directory)"
in="$t/in"
#mkfifo "$in"
out="$t/out"
#mkfifo "$out"
cat - 3>"$in" >&3 &
alacritty -e /bin/sh -c "cat '$in' | {...} > '$out'" >&2
cat "$out"
보시다시피 저는 그것을 명명된 파이프로 만들고 fd3을 사용해 보았습니다. 문제는 백그라운드 프로세스가 "stdin" 파일 설명자를 얻을 수 없는 일종의 특별한 셸일 수 있다고 생각했습니다.
...
명확하지 않은 경우 시도하는 이유는 EOF를 기다리지 않고 프로세스를 시작 하고 싶을 만큼 입력이 충분히 클 수 있기 때문입니다 .
이 모든 것이 잘못되었을 수도 있습니다. alacritty로 시작된 쉘에 "내" 파일 설명자를 "재할당"하는 방법이 있습니까? 이것이 내 첫 번째 생각이었지만 쉘에서 파일 설명자를 전달하는 방법에 대해서는 아무것도 찾을 수 없고 C(등) 포인터만 찾을 수 있습니다.
답변1
cat - 3>"$in" >&3 &
스크립트에서 실행하면 cat
stdin이 리디렉션됩니다 /dev/null
.
대화형 셸에서 실행하면 cat
신호에 의해 중지됩니다 SIGTTIN
.
어쨌든 파이프에는 "$in"
아무 것도 쓰지 않습니다.
이것이 스크립트의 일부인 경우 "해결책"(무엇을 하려는지 확실하지 않기 때문에 따옴표로 묶음)은 표준 입력을 리디렉션하여 "저장"한 exec [fd]<&0
다음 백그라운드 프로세스의 입력을 거기에서 리디렉션하는 것입니다. 표준 입력 [fd]
. 비교하다:
echo yes | sh -c 'cat & sleep 1'
표준 출력에는 아무 것도 쓰지 않습니다.
echo yes | sh -c 'exec 5<&0; cat <&5 & sleep 1'
그게 다야.