Variável de ambiente para o comando chamado via nice

2

Eu preciso definir uma variável de ambiente para um comando que está sendo chamado via nice. [Bash and dash, Slackware e FreeBSD.]

 $ JIM=20 nice -n 10 echo $JIM

 $

Não, echo não pode ver o JIM

 $ nice -n 10 JIM=20 echo $JIM
 nice: JIM=20: No such file or directory
 $

nice não gosta disso.

Eu posso exportar o JIM e, em seguida, o eco pode vê-lo, mas agora estou poluindo o ambiente. Imundo!

Eu tentei a opção "-" para indicar o fim das variáveis da linha de comando para nice , mas não faz diferença, nice reclama. Eu não acredito que ninguém quisesse fazer isso antes, então provavelmente estou cometendo um erro muito básico.

Alguma idéia?

    
por Nick Coleman 24.01.2014 / 11:43

3 respostas

4

JIM=x
JIM=20 nice -n 10 echo $JIM

passa a variável de ambiente JIM=20 para nice , mas não é nice nem echo que expande $JIM , que é o shell.

O shell bifurca um processo e executa:

execve("/usr/bin/nice", ["nice", "-n", "10", "echo", "x"], ["JIM=20", other vars])

nice define o niceness e, em seguida, executa no mesmo processo:

execve("/bin/echo", ["echo", "x"], ["JIM=20", other vars])

Portanto, echo recebe JIM=20 em seu ambiente, mas echo não faz nada com seu ambiente.

Você correu:

JIM=20 nice -n 10 sh -c 'echo $JIM'

Em seguida, sh teria feito algo com essa variável de ambiente. Os shells mapeiam as variáveis de ambiente que recebem para as variáveis do shell. Portanto, acima de, sh teria definido sua variável $JIM como 20 e chamado de echo construído com 20 como argumento.

    
por 24.01.2014 / 16:01
1

Tente isso

( export a=20; nice -n 10 sh -c 'echo $a' )
    
por 24.01.2014 / 11:54
0

Para meu caso particular, acabei fazendo o script renice, semelhante a este:

JIM=20 sh -c 'renice -n +15 -p $$; echo ${JIM}'
    
por 23.10.2015 / 14:07