gpt4 book ai didi

bash - bash 前向进程替换背后发生了什么?

转载 作者:行者123 更新时间:2023-11-29 09:12:10 24 4
gpt4 key购买 nike

根据维基百科,“进程替换也可用于捕获通常转到文件的输出,并将其重定向到进程的输入。”( http://en.wikipedia.org/wiki/Process_substitution )。

所以,用我自己的话说,这意味着通过进程替换,我可以获取命令 A 的输出并将其用作命令 B 的输入。换句话说,它就像一个管道(这对吗?) .

所以如果这是真的,如果我这样做:

echo "test" >(wc)

那么我应该期望得到以下内容:

1 1 5

因为我对上面命令的理解是类似下面的:

$echo "test" > tmp
$wc tmp
1 1 5 tmp

除非我不使用进程替换制作 tmp 文件。

但是我得到了以下输出:

test /dev/fd/63

这显然表明我的心智模型不正确。我哪里错了?

我理解<(命令)。例如

$diff <(head file1) <(head file2) 

很有道理。但不是 >(命令)。

最佳答案

来自 Process Substitution

The process list is run with its input or output connected to a FIFO or some file in /dev/fd. The name of this file is passed as an argument to the current command as the result of the expansion. If the >(list) form is used, writing to the file will provide input for list.

echo "test">(wc) 会发生什么?

打开文件/dev/fd/63 连接echo testwcwc 以其连接到 /dev/fd/63 的输入启动。然后这个文件的名称 (/dev/fd/63) 作为参数传递给当前命令 (echo "test"),导致 echo “测试”/dev/fd/63。这就是为什么你看到

test /dev/fd/63

作为输出。 wc 等待输入,但由于 echo 没有写入 /dev/fd/63,计数将为 0.

如果你想让它工作,你必须创建一个脚本,它接受最后一个参数并将前 N-1 个参数回显到最后一个

#! /bin/bash
echo "${@:1:$(($# - 1))}" >${@: -1}

当你调用它时

bash script.sh test >(wc)

你会看到预期的输出

1 1 5

关于bash - bash 前向进程替换背后发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070799/

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