Если вы измените строку ARGS = "$ ARGS ' $ 1 '"
до ARGS =" $ ARGS $ 1 "
(удаление одинарных кавычек) должно работать.
(в Bash) Можно заменить на массив значений:
find2() {
ARGS="/usr/bin/find"
ARGS+=( "$@" )
echo CALLING: "${ARGS[@]}"
"${ARGS[@]}"
}
find2 /tmp/test -name "hello.c"
Но это работает и гораздо проще:
find2() {
ARGS=( "/usr/bin/find" "$@" )
echo CALLING: "${ARGS[@]}"
"${ARGS[@]}"
}
find2 /tmp/test -name "hello.c"
Конечно, прямой способ тоже работает (в любой оболочке с функциями):
find2() { /usr/bin/find "$@"; }
find2 /tmp/test -name "hello.c"
Чтобы "увидеть", что делает код, можно использовать set -x или, еще лучше, заменить echo на printf, вот так:
find2() {
ARGS="/usr/bin/find"
ARGS+=( "$@" )
printf '<%s> ' CALLING: "${ARGS[@]}"; echo
"${ARGS[@]}"
}
find2 /tmp/test -name "hello.c"
Выполнив его, вы увидите:
$ ./script.sh
<CALLING:> </usr/bin/find> </tmp/test> <-name> <hello.c>
Каждый аргумент - отдельный элемент (обратите внимание на положение <>).
Однако в исходном коде (добавив 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"
При выполнении вы получите:
$ ./script.sh
<CALLING:> </usr/bin/find '/tmp/test' '-name' 'hello.c'>
Все значения представляют собой длинную текстовую строку, а не отдельные аргументы (обратите внимание на позицию <>).