Bash:使用进程替换粘贴错误

时间:2013-01-18 16:19:20

标签: bash unix paste

尝试使用粘贴命令对压缩文件使用进程替换时出现错误。

我正在尝试打开100个压缩文件并粘贴第二列。

当我尝试:

for name in $(ls FILEPATH/*.gz); do 
temp=${temp}" <(zcat "${name}" | cut -f2)"; done

paste ${temp} > DESTINATION/OUTPUTNAME'

我收到错误

 paste: invalid option -- f

当我尝试粘贴$(echo ${temp})而不是paste ${temp}时,我遇到了同样的问题,但当我echo ${temp}进入我的终端并手动将响应复制并粘贴到粘贴中时,它可以正常工作

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

好的,我怀疑正在发生的事情是:

temp变量会扩展为从gzip压缩文件中检索到的文件名列表。

如果字符串' - '存在,它告诉粘贴它应该停止解析选项的命令行,并且 - 后面的所有内容都是要使用的文件。

如果其中一个文件名启动-f则会出现错误。

paste -- ${temp} > DESTINATION/OUTPUTNAME

编辑:

从下面的评论看,好像你的bash版本支持重定向。

原始错误是由cat的-f2标志引起的。

试     echo&lt;(ls)

如果你得到像/ dev / fd这样的结果然后处理替换工作,我对发生的事情感到困惑,但我怀疑你不会得到它。

答案 1 :(得分:0)

问题是您无法嵌入shell语法,例如“&lt;(...)”和“|”在字符串中,因为在参数扩展发生之前识别命令行的那些部分。您放在temp中的所有内容都被视为paste的简单字符串参数。

没有简单的方法来完成你的尝试。我不愿意提及它,但我认为你需要使用eval

# Simpler than writing a loop
printf -v temp "<( zcat %s | cut -f2) " FILEPATH/*.gz

eval "paste $temp > DESTINATION/OUTPUTNAME"