Quero saber se existe uma maneira de colocar o e comercial em uma variável e ainda usá-lo para enviar um processo para o plano de fundo.
Isso funciona:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
Mas não seria legal realizar essas cinco linhas com apenas uma? Igual a:
BCKGRND='&'
sleep 5 ${BCKGRND}
Mas isso não funciona. Se BCKGRND não estiver definido, ele funcionará - mas quando estiver definido, ele será interpretado como um literal '&' e ocorrerá um erro.
bash
shell-script
variable
background-process
BrowncoatOkie
fonte
fonte
echo $!
retorna o PIDRespostas:
Não é possível usar uma variável para segundo plano a chamada porque a expansão da variável ocorre após a linha de comando ser analisada pelos operadores de controle (como
&&
e&
).Outra opção seria agrupar as chamadas em uma função:
... e defina a variável conforme necessário:
fonte
ed
? +1 de qualquer maneira, esta é a solução mais limpa.Você pode inverter as coisas e variar “em primeiro plano”:
Defina
FOREGROUND
comotrue
ou vazio para executar o processo em segundo plano. (DefinirFOREGROUND
paratrue
execução em segundo plano é reconhecidamente confuso! Nomes de variáveis apropriados são deixados como exercício para o leitor.)fonte
set -m
sido usado).Você provavelmente teria que usar
eval
:eval
faz com que o shell reavalie os argumentos fornecidos. Um literal&
seria, portanto, interpretado como&
no final de um comando e não como um argumento para o comando, colocando o comando em segundo plano.fonte
eval
deve conter um aviso de que isso deve ser tratado com cuidado. Veja, por exemplo, esta resposta ."$BCKGRND"
avaliar um argumento vazio.eval
unirá seus argumentos com espaços antes de fazer a avaliação real. Basta experimentá-lo:eval printf "'{%s}\n'" foo "" "" ""
.eval foo "" "" "" ""
é completamente semelhanteeval foo
, não importa o queIFS
ou outra coisa seja.eval 'sleep $TIMEOUT' "$BACKGROUND"
. Caso contrário, você poderá obter expansões duplas se a variável se expandir para outra variável ou contiver caracteres especiais. Além disso, a cotação aninhada pode ser complicada.