如何仅用管道和重定向将管道链输出作为文件重定向给命令?
解决方案
原错误写法
command3 < command1 | command2不符合预期的原因是shell运算符优先级:输入重定向<优先级高于管道|,shell会先尝试读取名为command1的文件内容传入command3,再将command3的输出通过管道传给command2,和需求逻辑完全相反。
符合要求的通用写法如下,全程仅使用管道和重定向,无命令替换、无子shell调用:
command1 | command2 | { read -r target_file; command3 < "$target_file"; }
逻辑说明
- 前半段
command1 | command2正常执行,输出的目标文件名通过管道传递给后续命令块 - 用
read -r读取管道传入的文件名,存入变量target_file - 大括号
{}包裹的命令块在当前shell上下文执行,不会产生子shell - 最后通过
<重定向将目标文件的内容输入给command3,完全满足要求
示例对应实现
针对给出的「在最新修改的文件中搜索hello」场景,对应写法为:
ls -t | head -n1 | { read -r new_file; grep "hello" < "$new_file"; }
该实现完全规避了不符合要求的写法:没有使用$()类命令替换,也用到了要求的输入重定向操作符。
内容的提问来源于stack exchange,提问作者wchmb
相关产品推荐
相关产品推荐

