Расширение $@
вlocal args="$@"
является неуказанным стандартом POSIX . Оболочка bash
создаст одну строку с разделителями -, содержащую все позиционные параметры, в качестве значения переменной args
, а dash
попытается выполнитьlocal args="$1" "$2" "$3"
(и т. д.)
Оболочки zsh
и ksh
ведут себя так же, как bash
(, создавая одну строку из позиционных параметров, хотя zsh
будет использовать первый символ $IFS
в качестве разделителя ), а yash
оболочка ведет себя как dash
, по крайней мере, в своих конфигурациях по умолчанию.
В вашем случае следует использовать
my_func () {
local args
args="$*"
printf 'args: <%s>\n' "$args"
}
или
my_func () {
local args="$*"
printf 'args: <%s>\n' "$args"
}
Здесь я использую $*
, чтобы было очевидно, что я создаю одну строку из списка значений. Строка будет содержать значения позиционных параметров, разделенных первым символом$IFS
(пробелом по умолчанию ).
Я также использую printf
, чтобы быть уверенным в правильности вывода значений, предоставленных пользователем -(см. Почему printf лучше, чем echo?).
Кроме того, ваш сценарий должен использовать #!/bin/dash
в качестве первой строки, а не #!/bin/sh
, поскольку local
является расширением стандартного синтаксиса sh
.