Использование вспомогательной функции:
concat () (
IFS=
printf '%s' "$*"
)
printf '"%s"\n' "$(concat "foo" \
"bar" \
"baz" )"
Это выведет
"foobarbaz"
Или, сначала поместив строковые биты аргумента в массив, а затем отдельно создав фактический аргумент (, предполагается использование оболочки с массивами):
concat () (
IFS=
printf '%s' "$*"
)
args=(
"foo"
"bar"
"baz"
)
concat_args=$( concat "${args[@]}" )
printf '"%s"\n' "$concat_args"
То же, что и выше, но с оболочкой POSIX.:
concat () (
IFS=
printf '%s' "$*"
)
set -- \
"foo" \
"bar" \
"baz"
concat_args=$( concat "$@" )
printf '"%s"\n' "$concat_args"
Обратите внимание, что тело функции concat
выполняется в своей собственной подоболочке (, что и (...)
делает ), что означает, что изменение в IFS
является локальным для функции.
Обоснование использования "$*"
вместо "$@"
в функции чисто для эстетики. "$*"
расширится до одиночной строки, которая printf
будет напечатана. Фактическая конкатенация в этом случае выполняется расширением оболочки $*
без разделителя (пустым$IFS
). Вместо этого использование "$@"
расширило бы количество отдельных строк, к которым printf
неоднократно применяла бы свою строку формата. Конкатенация в этом случае будет побочным эффектом использования конкретной строки формата с printf
.
Или та же идея (создание фактической строки аргумента отдельно ), но без этой вспомогательной функции,
arg=\
"foo"\
"bar"\
"baz"
printf '"%s"\n' "$arg"
printf '"%s"\n'
выше во всех случаях будет заменен вашим some_command --flag
.
У меня была та же проблема, когда я пытался настроить сервер minecraft под systemd на Debian 9. Насколько мне известно, никаких исправлений нет, но вот частичная работа -. Я добавил эти строки в файл конфигурации юнита:
PermissionsStartOnly=true
ExecStartPre=/bin/chmod 777 /run/screen
Таким образом, это позволит настроить разрешения, необходимые для запуска службы. И я могу снова установить разрешения на 775 всякий раз, когда мне нужно использовать экран для себя.