String 如何并行运行bash函数并按顺序将所有输出合并为一个字符串?

String 如何并行运行bash函数并按顺序将所有输出合并为一个字符串?,string,bash,parallel-processing,String,Bash,Parallel Processing,我正在以的样式编写几个bash提示函数,我希望它们并行运行,并按顺序合并它们的输出。速度至关重要,我希望避免写入任何文件系统,无论是内存还是硬盘 我的想法是尝试并行设置变量,但在同一范围内不可行。GNU Parallel和parset不接受bash函数 my.bashrc的结尾: :“${ORIGINAL_PS1:=$PS1}” 提示符(){ git=“$(git\u提示符)” pamac=“$(pamac\u提示符)” busch=“$(busch_提示符)” PS1=“$git$pamac

我正在以的样式编写几个bash提示函数,我希望它们并行运行,并按顺序合并它们的输出。速度至关重要,我希望避免写入任何文件系统,无论是内存还是硬盘

我的想法是尝试并行设置变量,但在同一范围内不可行。GNU Parallel和parset不接受bash函数

my.bashrc的结尾:


:“${ORIGINAL_PS1:=$PS1}”
提示符(){
git=“$(git\u提示符)”
pamac=“$(pamac\u提示符)”
busch=“$(busch_提示符)”
PS1=“$git$pamac$BUSCH$ORIGINAL_PS1”
}
PROMPT\u COMMAND=“PROMPT;$PROMPT\u COMMAND”

(GIT_PROMPT、PAMAC_PROMPT和busch_PROMPT是bash函数的来源)

狭义地回答这个问题,生成三个进程替换并将其结果连接起来将使工作并行进行,同时以已知顺序生成输出:

PS1=$(cat <(GIT_PROMPT) <(PAMAC_PROMPT) <(BUSICH_PROMPT))

PS1=$(cat解决方案1:使用
env_parallel

env_parallel --session
GIT_PROMPT() { echo stdoutgit; echo stderrgit >&2; sleep 2; }
PAMAC_PROMPT() { echo stdoutpamac; echo stderrpamac >&2; sleep 2; }
BUSICH_PROMPT() { echo stdoutbusich; echo stderrbusic >&2; sleep 2; }
PS1=`env_parallel -k ::: GIT_PROMPT PAMAC_PROMPT BUSICH_PROMPT`
env_parallel --endsession
解决方案2:导出功能

GIT_PROMPT() { echo stdoutgit; echo stderrgit >&2; sleep 2; }
export -f GIT_PROMPT
PAMAC_PROMPT() { echo stdoutpamac; echo stderrpamac >&2; sleep 2; }
export -f PAMAC_PROMPT
BUSICH_PROMPT() { echo stdoutbusich; echo stderrbusic >&2; sleep 2; }
export -f BUSICH_PROMPT
PS1=`parallel -k ::: GIT_PROMPT PAMAC_PROMPT BUSICH_PROMPT`
只有stdout被捕获,所以您需要自己处理stderr(可能只是将其重定向到stdout)


(GNU Parallel在
/tmp
中使用tempfiles,但非常努力地清理这些文件-通常在创建文件后不到1毫秒。文件保持打开状态,因此文件的活动通常在删除后发生).

旁白:所有caps用户定义函数和变量名的格式都不好。所有caps都是为对shell和操作系统有意义的名称保留的。因此,
PROMPT\u命令
都是caps,因为它对shell有意义;
pamac\u PROMPT
应该是小写(或混合大小写),因为它是用户定义的。请参阅POSIX标准中关于命名约定的讨论(一个据称特定于环境变量的文档;但是,shell变量共享相同的命名空间)。如果GIT_提示符运行类似于
GIT status
,那么GIT将已经执行了很多文件系统操作。其他人可能也会访问文件系统。我想说@Charles Duffy的答案是最好的选择,但我的实际建议是不要用外部状态重载提示符。谢谢,堆栈溢出在我访问之前就吃掉了我的答案完成后,我无法对其进行编辑。我无法正确实现解决方案2,因为每个函数都会调用更多隐藏的bash函数,我没有提到这些函数。我也导出了它们,但现在什么都没有显示。感谢您的回答。我不认为这是优化步骤,但我认为这是许多步骤中的一个。不过,我认为这将节省大量时间。
GIT_PROMPT() { echo stdoutgit; echo stderrgit >&2; sleep 2; }
export -f GIT_PROMPT
PAMAC_PROMPT() { echo stdoutpamac; echo stderrpamac >&2; sleep 2; }
export -f PAMAC_PROMPT
BUSICH_PROMPT() { echo stdoutbusich; echo stderrbusic >&2; sleep 2; }
export -f BUSICH_PROMPT
PS1=`parallel -k ::: GIT_PROMPT PAMAC_PROMPT BUSICH_PROMPT`