【发布时间】:2014-12-19 20:55:54
【问题描述】:
这是我的脚本
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
$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")
【问题讨论】:
-
你为什么在这里使用
eval?