1

У меня есть сценарий оболочки, который запускает exec чтобы заменить себя другой командой. Другая команда принимает некоторые необязательные аргументы.

exec mycommand $ARG1 $ARG2 $ARG3

Любой из этих аргументов может быть заполнен или не заполнен. Если они не заполнены, они не отображаются в качестве аргумента функции. Например:

# if you have:
ARG1=foo
ARG3=bar
exec mycommand $ARG1 $ARG2 $ARG3
# then you get:
exec mycommand foo bar

Однако я хочу, чтобы в значениях этих аргументов пробелы были допустимыми, и чтобы они не приводили к дополнительным аргументам. То есть,

# if you have
ARG1="foo bar baz"
ARG2="qux"
exec mycommand $ARG1 $ARG2 $ARG3
# then I want:
exec mycommand "foo bar baz" qux
# not:
exec mycommand foo bar baz qux

Я пытался вставить в аргументы экранированные кавычки, но exec ожидал, что они будут буквально частью значения.

ARG1="\"foo bar baz\""
exec mycommand $ARG1 $ARG2 $ARG3
# gives you:
exec mycommand \"foo bar baz\"

Я также попытался заключить в кавычки переменные в exec, но затем он начал передавать пустые строки, когда аргументы отсутствовали:

ARG2="foo bar"
exec mycommand "$ARG1" "$ARG2" "$ARG3"
# gives you:
exec mycommand "" "foo bar" ""

Есть ли лучший способ создать команду и передать ее в exec? Есть ли другой способ заменить текущий процесс другим?

1 ответ1

1

В bash вы используете массив, и все переменные должны быть в кавычках:

ARG1="foo bar baz"
ARG3="qux"

cmd=( mycmd )

[[ -n "$ARG1" ]] && cmd+=( "$ARG1" )
[[ -n "$ARG2" ]] && cmd+=( "$ARG2" )
[[ -n "$ARG3" ]] && cmd+=( "$ARG3" )

printf "%s\n" "${cmd[@]}"
#exec "${cmd[@]}"

Это даст вам требуемый вызов: exec mycommand "foo bar baz" qux без аргументов "пустая строка". Удалите строку printf и раскомментируйте строку exec, если вы довольны тем, как она работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .