gpt4 book ai didi

linux - 我可以避免使用 FIFO 文件加入 Bash 管道的末尾以存储在当前 shell 的变量中吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:23 27 4
gpt4 key购买 nike

我有以下功能:

execIn ()
{
local STORE_INvar="${1}" ; shift
printf -v "${STORE_INvar}" '%s' "$( eval "$@" ; printf %s x ; )"
printf -v "${STORE_INvar}" '%s' "${!STORE_INvar%x}"
}

getFifo ()
{
local FIFOfile
FIFOfile="/tmp/diamondLang-FIFO-$$-${RANDOM}"
while [ -e "${FIFOfile}" ]
do
FIFOfile="/tmp/diamondLang-FIFO-$$-${RANDOM}"
done
mkfifo "${FIFOfile}"
echo "${FIFOfile}"
}

我想将管道末端的输出存储到管道末端函数的变量中,但是,我发现在早期版本的 Bash 中唯一可行的方法是使用 mkfifo 制作临时 fifo 文件。我希望使用文件描述符来避免必须创建临时文件。所以,这可行,但并不理想:

设置:(在执行此操作之前,我需要将一个 FIFO 文件分配给一个 var,供其余进程使用)

$ FIFOfile="$( getFifo )"

我要坚持的流水线:

$ printf '\n\n123\n456\n524\n789\n\n\n' | grep 2  # for e.g.

Action :(我现在可以添加)>${FIFOfile} &

$ printf '\n\n123\n456\n524\n789\n\n\n' | grep 2 >${FIFOfile} &

注意需要用 & 作为背景 - 问题 1:我将 [1] <PID_NO> 输出到屏幕。

实际坚持:

$ execIn SOME_VAR cat - <${FIFOfile}

问题 2:屏幕上出现更多噪音

[1]+  Done  printf '\n\n123\n456\n524\n789\n\n\n' | grep 2 > ${FIFOfile}

问题 3:我在流的开始而不是像我以前经历的那样在结束时松开空白。

那么,我这样做是否正确?我确信必须有一种方法可以避免需要使用文件描述符进行清理的 FIFO 文件,但我似乎无法做到这一点,因为我无法将问题的任何一方分配给未附加到的文件描述 rune 件或 FIFO 文件。

我可以尝试用现有的解决方案解决问题,尽管为了使它正常工作我想我需要预先建立一个可以拉入使用的 FIFO 文件池,否则我有一个预先要求在命令之前建立这个文件。因此,出于多种原因,这远非理想。如果有人能告诉我一个更好的方法,你会让我的一天/一周/一个月/生活:)

提前致谢...

最佳答案

从古代开始,bash 中就提供了进程替换。您绝对没有太旧以至于无法使用的版本。因此,根本不需要使用 FIFO:

readToVar() { IFS= read -r -d '' "$1"; }
readToVar targetVar < <(printf '\n\n123\n456\n524\n789\n\n\n')

你会观察到:

printf '%q\n' "$targetVar"

...正确保留前导换行符和尾随换行符。


相比之下,在您无法承受丢失标准输入的用例中:

readToVar() { IFS= read -r -d '' "$1" <"$2"; }
readToVar targetVar <(printf '\n\n123\n456\n524\n789\n\n\n')

如果您真的想要通过管道传输到这个命令,愿意需要一个非常现代的 bash,并且不介意与作业控制不兼容:

set +m            # disable job control
shopt -s lastpipe # in a pipeline, parent shell becomes right-hand side

readToVar() { IFS= read -r -d '' "$1"; }
printf '\n\n123\n456\n524\n789\n\n\n' | grep 2 | readToVar targetVar

关于linux - 我可以避免使用 FIFO 文件加入 Bash 管道的末尾以存储在当前 shell 的变量中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30058345/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com