Przekieruj stdin skryptu do pliku w tle

Oct 12 2020

Aby przekazać stdin mojego skryptu do stdin polecenia w instancji alacritty, którą się odradza, próbuję przekierować go do pliku w tle (aby polecenie mogło zacząć go odczytywać):

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"

Jak widać, próbowałem uczynić go nazwanym potokiem, a także używając fd3, myśląc, że problemem może być jakiś rodzaj specjalnej wielkości liter, że procesy działające w tle nie otrzymują deskryptora pliku „stdin”.

Jeśli nie jest to jasne, powodem prób jest to, że dane wejściowe mogą być na tyle duże, że chcę rozpocząć ...proces bez czekania na EOF.

Prawdopodobnie robię to źle - czy istnieje sposób na „ponowne przypisanie” „moich” deskryptorów plików do powłoki uruchomionej przez alacritty? To była moja pierwsza myśl, ale nie mogłem znaleźć niczego na temat przekazywania deskryptorów plików z powłoki, tylko wskaźniki C (itp.).

Odpowiedzi

1 user414777 Oct 12 2020 at 17:13
cat - 3>"$in" >&3 &

Jeśli uruchomisz to ze skryptu, catstdin zostanie przekierowany z /dev/null.

Jeśli uruchomisz go z interaktywnej powłoki, catzostanie zatrzymany przez SIGTTINsygnał.

W każdym razie nic nie zapisze na "$in"rurze.

Jeśli jest to część skryptu, „rozwiązaniem” (scarequotes, ponieważ nie bardzo wiem, co próbujesz zrobić) jest „zapisanie” stdin z exec [fd]<&0przekierowaniem, a następnie przekierowanie wejścia procesu w tle z tego [fd]. Porównać:

echo yes | sh -c 'cat & sleep 1'

który nie wypisze niczego na stdout, z

echo yes | sh -c 'exec 5<&0; cat <&5 & sleep 1'

co wystarczy.