Shell

將腳本標準輸入重定向到後台文件

  • October 12, 2020

為了將我的腳本的標準輸入傳遞給它產生的 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'

這會做。

引用自:https://unix.stackexchange.com/questions/614141