BASH: назначить '&' переменной NOT как строку - PullRequest
0 голосов
/ 19 ноября 2009

Я хотел условно запустить команду как фоновый или приоритетный процесс, поэтому я написал что-то вроде этого:

test $some_var; bg_suffix=&
long_command $bg_suffix

это не работает, потому что bg_suffix всегда пусто независимо от того, назначено оно или нет.

Но

test $some_var; bg_suffix="&"
long_command $bg_suffix

тоже не работает, потому что теперь bg_suffix интерпретируется как строка.

Есть идеи, как решить эту проблему? Спасибо!

Ответы [ 4 ]

3 голосов
/ 19 ноября 2009

Вот как это сделать без использования кавычек

inBackground () {
  t=$1
  shift
  if $t; then
    "$@"&
  else
    "$@"
  fi
}

Это позволяет вам сделать что-то вроде:

inBackground false echo '$$'
inBackground true sleep 4

Это позволяет обойти проблему, которая есть во всех решениях на основе eval: новые, а иногда и невозможные правила цитирования. Например, попробуйте пропустить '$$' через eval. Поскольку true и false несущественны для парсера, они могут быть в переменных, и все будет работать.

Конечно, если вы хотите, чтобы работали метачары оболочки (скажем, вы перенаправили ввод / вывод), тогда eval лучше, или вам нужно определить процедуру для команды, и если вы определяете процедуру, ваша проблема решена:

complicated_command () {
    sleep 3
    echo replace this with something complex
}
do_background=true
$do_background && (complicated_command&) || complicated_command
3 голосов
/ 19 ноября 2009

Как насчет:

if [[ ${somevar} ]] ; then
    long_command &
else
    long_command
fi

или, если - длинная команда, которую вы не хотите вводить дважды:

long_command=insert your big honking command here
if [[ ${somevar} ]] ; then
    ${long_command} &
else
    ${long_command}
fi

Как и в стороне, я надеюсь, что вы знаете, что последовательность команд:

test ${condition}; x=2

установит x на 2 независимо от результатов test. Возможно, вы хотели написать:

test ${condition} && x=2
2 голосов
/ 19 ноября 2009

ты пробовал

eval (long_command $bg_suffix) 

с использованием bg_suffix = "&"

1 голос
/ 19 ноября 2009

Не знаю, почему я не могу комментировать, но все равно

test $ some_var; bg_suffix = "&"

приведет к установке bg_suffix независимо от результата теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...