スクリプトの標準入力を生成された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'
それはすべてです。