Я хочу знать, есть ли способ поместить амперсанд в переменную и по-прежнему использовать его для отправки процесса в фоновый режим.
Это работает:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
Но разве не здорово было бы выполнить эти пять строк одной? Вот так:
BCKGRND='&'
sleep 5 ${BCKGRND}
Но это не работает. Если BCKGRND не установлен, он работает - но когда он установлен, он интерпретируется как литерал '&' и выдает ошибки.
bash
shell-script
variable
background-process
BrowncoatOkie
источник
источник
echo $!
Ответы:
Невозможно использовать переменную для фонового вызова, потому что расширение переменной происходит после анализа командной строки для управляющих операторов (таких как
&&
и&
).Еще один вариант - заключить вызовы в функцию:
... и затем установите переменную по мере необходимости:
источник
ed
? +1 в любом случае, это самое чистое решение.Вы можете перевернуть вещи и изменить «приоритет»:
Установите
FOREGROUND
наtrue
или опорожнить , чтобы запустить процесс в фоновом режиме. (НастройкаFOREGROUND
дляtrue
запуска в фоновом режиме, по общему признанию, сбивает с толку! Соответствующие имена переменных оставлены в качестве упражнения для читателя.)источник
set -m
не использовался).Вам, вероятно, придется использовать
eval
:eval
заставляет оболочку переоценивать приведенные аргументы.&
Таким образом, литерал будет интерпретироваться как&
конец команды, а не как аргумент команды, помещая команду в фоновом режиме.источник
eval
должен содержать предупреждение, что с этим следует обращаться осторожно. Смотрите, например, этот ответ ."$BCKGRND"
оценкой пустого аргумента.eval
объединит свои аргументы с пробелами, прежде чем делать фактический eval. Просто попробуйтеeval printf "'{%s}\n'" foo "" "" ""
.eval foo "" "" "" ""
полностью похож наeval foo
, независимо от того, чтоIFS
или другое.eval 'sleep $TIMEOUT' "$BACKGROUND"
. В противном случае вы можете получить двойное расширение, если переменная раскрывается в другую переменную или содержит специальные символы. Кроме того, вложенные цитаты могут быть хитрыми.