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

329
Nick Retallack

У меня есть сценарий оболочки, который выполняется, 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
http://mywiki.wooledge.org/BashFAQ/050 - как сохранить команду в переменной. glenn jackman 9 лет назад 0

1 ответ на вопрос

1
glenn jackman

With bash, you use an array, and all variables must be properly quoted:

ARG1="foo bar baz" ARG3="qux" cmd=( mycmd ) [[ -n "$ARG1" ]] && cmd+=( "$ARG1" ) [[ -n "$ARG2" ]] && cmd+=( "$ARG2" ) [[ -n "$ARG3" ]] && cmd+=( "$ARG3" ) printf "%s\n" "$" #exec "$" 

This will give you the invocation you want: exec mycommand "foo bar baz" qux with no "empty string" arguments. Remove the printf line and uncomment the exec line if you're happy with how it's working.

Похожие вопросы