bash:脚本参数$ {1}干扰xargs'$ 1}内部脚本

时间:2013-03-25 21:03:13

标签: bash

长话短说,我有一个看起来像这样的脚本块:

cd ${1} # via command-line argument
find . -name "output*.txt" | xargs cat ${1} | grep -v ${filter} > temp.txt

我基本上到了这一步,在命令行中构建find ...行,然后将其粘贴到我的脚本中,然后添加cd命令,以便在包装器中重用此脚本将在大量目录上运行此脚本。无论如何...

问题是cdxargs使用相同的${1}变量,哪种变种

我知道我可以从${1}删除xargs参数,我可能会重写find命令根本不需要xargs,但我的问题仍然存在:

我在${1}使用cd之后是否有办法“重置”xargs,以便{{1}}不会

3 个答案:

答案 0 :(得分:2)

我不熟悉使用xargs作为默认替换字符串的${1}版本,但以下内容应该有效:

find . -name "output*.txt" | xargs -I '{}' cat '{}' | grep -v ${filter} > temp.txt

答案 1 :(得分:0)

实用程序xargs只是管理参数的数量,并且大括号充当参数或文件名{}的占位符。

我确实模拟了你拥有的包装器,并且因为$ {1}传递给我的函数的路径名被xargs拾取了同样的问题......但这就是shell的工作方式,实际上shell只会替换/展开所有变量和内容以使命令在执行前完成

实用程序arnt编码自己处理这个问题,他们只是不这样做...... 例如:

echo * ;

这里shell将展开*并将其替换为当前目录中的所有文件名,并在执行命令echo *

之前将它们作为参数@传递给echo实用程序

同样在你的情况下,shell正在将$ {1}扩展到你在执行命令之前传递的路径名.....这就是为什么你得到了你的东西。

解决方案:你可以使用大括号(当然是空的)或者更好的只是放下它们.......它对我来说很好.......

find . -iname "*${filename}*" | xargs ls -l | more commands ....;

希望这会有所帮助。

答案 2 :(得分:0)

您使用find + xargs会遇到分隔符问题https://en.wikipedia.org/wiki/Xargs#The_separator_problem

这是一个没有这个问题的解决方案。它使用GNU Parallel:

find . -name "output*.txt" | parallel cat {} | grep -v ${filter} > temp.txt

安装GNU Parallel需要花费10秒钟的时间:

wget pi.dk/3 -qO - | sh -x

观看介绍视频以了解详情:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1