백그라운드에서 스크립트 표준 입력을 파일로 리디렉션

백그라운드에서 스크립트 표준 입력을 파일로 리디렉션

스크립트의 표준 입력을 생성된 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 &

스크립트에서 실행하면 catstdin이 리디렉션됩니다 /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'

그게 다야.

관련 정보