(no Bash) Você pode mudar para uma matriz de valores:
find2() {
ARGS="/usr/bin/find"
ARGS+=( "$@" )
echo CALLING: "${ARGS[@]}"
"${ARGS[@]}"
}
find2 /tmp/test -name "hello.c"
Mas isso funciona e é bem mais simples:
find2() {
ARGS=( "/usr/bin/find" "$@" )
echo CALLING: "${ARGS[@]}"
"${ARGS[@]}"
}
find2 /tmp/test -name "hello.c"
Claro, o caminho direto também funciona (em qualquer shell com funções):
find2() { /usr/bin/find "$@"; }
find2 /tmp/test -name "hello.c"
Por que o código original falhou?
Para "ver" o que o código está fazendo, você pode usar set -x ou better yet, substitua o echo por printf, desta forma:
find2() {
ARGS="/usr/bin/find"
ARGS+=( "$@" )
printf '<%s> ' CALLING: "${ARGS[@]}"; echo
"${ARGS[@]}"
}
find2 /tmp/test -name "hello.c"
Quando você o executa, você vê:
$ ./script.sh
<CALLING:> </usr/bin/find> </tmp/test> <-name> <hello.c>
Cada argumento é um elemento separado (observe a posição do < >).
No entanto, no seu código original (adicionando printf):
function find2 {
ARGS="/usr/bin/find"
while [[ $# -gt 0 ]]; do
ARGS="$ARGS '$1'"
shift
done
printf '<%s> ' CALLING: "${ARGS[@]}"; echo
$ARGS
}
find2 /tmp/test -name "hello.c"
Você receberá, em execução:
$ ./script.sh
<CALLING:> </usr/bin/find '/tmp/test' '-name' 'hello.c'>
Todos os valores são uma longa linha de texto, não argumentos separados (observe a posição do < >).