Вот как это сделать без использования кавычек
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