Przekieruj stdin skryptu do pliku w tle
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
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.