加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash正向流程替换背后发生了什么?

发布时间:2020-12-15 21:09:15 所属栏目:安全 来源:网络整理
导读:根据维基百科,“进程替换也可用于捕获通常会转到文件的输出,并将其重定向到进程的输入.”( http://en.wikipedia.org/wiki/Process_substitution). 所以,用我自己的话来说,这意味着通过进程替换,我可以获取命令A的输出并将其用作命令B的输入.换句话说,它就像
根据维基百科,“进程替换也可用于捕获通常会转到文件的输出,并将其重定向到进程的输入.”( 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测试与wc连接. wc启动时输入连接到/ dev / fd / 63.然后将该文件的名称(/ dev / fd / 63)作为参数传递给当前命令(echo“test”),从而产生echo“test”/ 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读