这是我的脚本
eval "find \\( -type f -a \\( -name '*.h' \\) \\) -print0" | xargs -0 -n100 grep -f <(echo "stdio")
echo $?
未找到任何内容,退出代码为 123。
如果我稍微修改一下如下
echo "stdio" >.P
eval "find \\( -type f -a \\( -name '*.h' \\) \\) -print0" | xargs -0 -n100 grep <.P
echo $?
发现了一些东西,但退出代码仍然是 123。
实际上我只是想写一个小脚本来使 find+xargs+grep 更容易。例如,
xgrep -e PATTERN1 -e PATTERN2 ... *.c *.h
是执行
find -name *.c -o -name *.h | xargs grep -f <(echo "$PATTEN1
$PATTERN2")
使用-f
选项而不是-e
是为了避免在模式中转义单引号或双引号时出现麻烦。
#!/bin/bash
#set -e -o pipefail
eval ARGV=($(getopt -l '' -o 'e:li' -- "$@")) || exit 1
for((i=0;i<${#ARGV[@]};i++)) {
o="${ARGV[$i]}"
case $o in
-e)
i=$((i+1));
a="${ARGV[$i]}"
if [ -n "$grep_patterns" ]; then
grep_patterns="$grep_patterns"$'\n'
fi
grep_patterns="$grep_patterns$a"
;;
-i)
grep_options="$grep_options -i"
;;
-l)
grep_options="$grep_options -l"
;;
--)
i=$((i+1));
break;;
esac
}
for((;i<${#ARGV[@]};i++)) {
if [ -n "$find_options" ]; then
find_options="$find_options -o "
fi
find_options="${find_options}-name '${ARGV[$i]}'"
}
cmd="find \\( -type f -a \\( $find_options \\) \\) -print0"
eval "$cmd" | xargs -0 grep $grep_options -f <(echo "$grep_patterns")
123 表示“任何以非零状态退出的调用”。所以xargs
ran grep
至少两次(因为您向其提供了如此多的文件,以至于它们超出了最大命令行长度,您将其限制为 100 个文件),并且至少有一次调用是针对一组不包含匹配项的文件,这导致退出代码来自grep
非零(失败)。
也许你应该解释一下你想要实现的目标。这eval
看起来多余,双重重定向可能无法实现您想要的(grep
的标准输入不能同时连接到管道eval
and to .P
).
如果您想将第一个参数参数化为grep
,也许做类似的事情
#!/bin/sh
find -type f -name '*.h' -print0 |
xargs -0 -n100 grep "$1"
...你可以用例如调用它stdio
作为第一个参数。
(另请注意,参数已大大简化find
。你只有两个谓词,所以不需要括号任何东西,然后-a
也可以删除。)
如果存在,退出代码仍为 123grep
返回零匹配的调用。您可以通过省略来减少机会-n 100
(无论如何,这似乎几乎没有任何有用的目的)但如果你想绝对阻止它,你可以将整个管道提供给| grep .
如果有任何输出,它将报告成功。 (或者你可以运行xargs
在包装器上,如果退出代码来自,则总是返回成功grep
是 0 或 1,但这更复杂,即使在零匹配的情况下,您也会看到“成功”。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)