バックグラウンドでスクリプト標準入力をファイルにリダイレクトする

バックグラウンドでスクリプト標準入力をファイルにリダイレクトする

スクリプトの標準入力を生成された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'

それはすべてです。

関連情報