Вот мой сценарийGot код выхода 123 в находке + xargs Grep
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.
Итак, что не так?
================================================================================================================================== ===================================
На самом деле я просто хочу написать небольшой скрипт, чтобы упростить поиск + xargs + grep. Для exmaple,
xgrep -e -e ТЕСТ1 ТЕСТ2 ... * .c * .h
является выполнение
найти -name * .c -o -name * .h | xargs Grep -f < (эхо " $ PATTEN1 $ PATTERN2 ")
Используйте -f вместо -e, чтобы избежать неприятностей в экранировании одиночных или двойных кодов внутри шаблонов.
#!/bin/bash
#set -e -o pipefail
eval ARGV=($(getopt -l '' -o 'e:li' -- "[email protected]")) || 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' здесь? –