Создайте команду для bash exec


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? Есть ли другой способ заменить текущий процесс другим?


mywiki.wooledge.org/BashFAQ/050 - как сохранить команду в переменной.
Гленн Джекман

Ответы:


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, если вы довольны тем, как она работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.