Substitua sua última linha por:
exec su someuser -c '/tmp/elasticsearch-6.4.2/bin/elasticsearch "$@"' -- dummy-argv0 "$@"
Geralmente, esta é a maneira de passar argumentos através do comando su
:
su user -c 'command "$@"' -- argv0 "$@"
Você deve omitir o --
em sistemas não-linux.
su
na página de manual ( su [options] [username]
) é enganosa, aqui está um palavreado abaixo dela:
Additional arguments may be provided after the username, in which case they are supplied to the user's login shell.
....
You can use the -- argument to separate su options from the arguments supplied to the shell.
Você também deve substituir todos os echo
s por printf '%s\n' ...
, pois os echo
incorporados de bash
e zsh
e /bin/echo
do linux usarão o argumento -E
(totalmente contrário ao que o padrão exige). Geralmente, não há como usar com segurança echo
com variáveis que podem se expandir para -n
, -e
ou -E
.
Nota:
Usar "$@"
é a única maneira de preservar os argumentos exatamente como foram passados - qualquer variação de su -c "command $*"
funcionará somente enquanto nenhum argumento contiver espaços ou quaisquer outros caracteres especiais que possam ser interpretados pelo shell . Até mesmo o exemplo atual poderia ser facilmente subvertido por um mkdir -p repositories.url.allowed_urls=http:/snapshot.test.only.ME.and.ME.and.ME
no diretório inicial de someuser
.