gpt4 book ai didi

linux - 将 stdout 两次传递给同一个命令

转载 作者:太空狗 更新时间:2023-10-29 12:09:05 25 4
gpt4 key购买 nike

您好,我对如何将 stdout 两次传递给同一个命令很感兴趣...

例如,如果我运行以下命令:

seq 5 >a
tac a >b
paste a b

然后我得到:

1       5
2 4
3 3
4 2
5 1

以下也提供相同的结果:

paste <(seq 5) <(seq 5 |tac)

seq 5 | paste - <(seq 5 |tac)

我只想使用一次 seq 5 - 可能与这些尝试类似,但它们不起作用:

seq 5 | paste - <(tac -)

seq 5 | tee >(tac 1>&3) | paste - >(3>&1 cat)

我希望某种文件描述符操作或进一步的进程替换魔法可以解决问题,但我无法做到这一点。

最佳答案

你可以这样做:

rootdir=$(mktemp -d)  # Strictly speaking not needed, but we create us a tempdir
mkfifo "$rootdir/pipe" # create a named pipe
seq 5 | tee "$rootdir/pipe" | paste - <(tac "$rootdir/pipe")
# We could now tee (split) output into that pipe
rm -Rf "$rootdir" # cleanup

您还可以涉及额外的文件描述符,但您仍然需要一些东西来支持它以连接流的两端。问题是,虽然您可以多路复用输出,但在新创建的问题上您仍然只有一个输入流(当管道命令连接到前一过程的 stdout 时)。必须添加第二条传输路径。

tmpfile=$(mktemp); exec 3<>"$tmpfile"; rm "$tmpfile"

创建一个临时文件并打开 fd 3 进行读/写。一旦我们有了文件描述符,我们就不再需要文件系统中该文件的名称。

seq 5 | tee /proc/self/fd/3 | paste - <(tac </proc/self/fd/3)

我们仍然使用 tee 将输出拆分为 stdout 和 fd 3. 文件描述符由子进程继承,因此我们可以使用 /引用它们proc/self/(也是从teetac的角度)

关于linux - 将 stdout 两次传递给同一个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54615799/

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