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.