Shell
將腳本標準輸入重定向到後台文件
為了將我的腳本的標準輸入傳遞給它產生的 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 啟動的 shell 中?這是我的第一個想法,但我找不到從 shell 傳遞文件描述符的任何東西,只有 C(等)指針。
cat - 3>"$in" >&3 &
如果您從腳本執行它,
cat
的標準輸入將從/dev/null
.如果從互動式 shell 執行它,
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'
這會做。