Eu posso executar o seguinte comando no bash sem erros:
$ find /d/Code/Web/Development/Source/ \( -name '*.cs' -o -name '*.cshtml' \) -exec grep -IH UserProfileModel {} \;
Eu escrevi uma função em .bash_aliases para executar rapidamente este comando:
search() {
local file_type file_types find_cmd opt OPTARG OPTIND or pattern usage
usage="Usage: search [OPTION] ... PATTERN [FILE] ...
Search for PATTERN in each FILE.
Example: search -t c -t h 'hello world' /code/internal/dev/ /code/public/dev/
Output control:
-t limit results to files of type"
if [[ $1 == --help ]]; then
echo "$usage"
return
fi
file_types=()
while getopts ":t:" opt; do
case $opt in
t)
file_types+=("$OPTARG")
;;
?)
echo "$usage"
return
;;
esac
done
shift $((OPTIND-1))
if (( $# == 0 )); then
echo "$usage"
return
fi
pattern=$1
shift
if (( $# == 0 )); then
echo "$usage"
return
fi
find_cmd=(find "$@" '\(')
or=""
for file_type in "${file_types[@]}"; do
find_cmd+=($or -name \'*.$file_type\')
or="-o"
done
find_cmd+=('\)' -exec grep -IH "$pattern" {} '\;')
"${find_cmd[@]}"
}
No entanto, a função gera um erro:
find: paths must precede expression
Se eu alterar a última linha para echo "${find_cmd[@]}"
, ele imprime exatamente o mesmo comando acima:
$ search -t cs -t cshtml UserProfileModel /d/Code/Web/Development/Source/
find /d/Code/Web/Development/Source/ \( -name '*.cs' -o -name '*.cshtml' \) -exec grep -IH UserProfileModel {} \;
Não entendo por que funcionaria quando executado no console, mas falha quando executado dentro de uma função.
Além disso, se eu simplificar a função apenas para o comando, ela funciona:
search() {
find /d/Code/Web/Development/Source/ \( -name '*.cs' -o -name '*.cshtml' \) -exec grep -IH UserProfileModel {} \;
}
Estou editando o .bash_aliases no Notepad ++, mas verifiquei se os finais de linha são em formato Unix.
Editar
Por conselho de F. Hauri abaixo, eu ativei a depuração. Aparentemente este é o comando que está sendo executado:
find /d/Code/Web/Development/Source/ '\(' -name ''\''*.cs'\''' -o -name ''\''*.cshtml'\''' '\)' -exec grep -IH UserProfileModel '{}' '\;'
Não sei o que fazer com essa informação. Remover o caractere de escape antes dos parênteses faz com que ele lance um erro diferente:
find: missing argument to -exec