Variable definition in 'sh -c'
sh -c 'TMP=??; echo $TMP;'
When using double quotes the parameter expansion occurs when the command line is built i.e. the shell does not see
TMP=??; echo $TMP;
as its parameter but
TMP=??; echo ;
$TMP is empty in the calling shell environment.
sh -c 'TMP=??; echo "$TMP"'
With double quotes around the
sh -c code, the
$TMP is expanded by the interactive shell before the
sh -c code executes. With single quotes,
$TMP will be expanded inside the
sh shell. (I've also properly quoted the
$TMP variable expansion for
Single quotes protects a string from variable expansions.
If you do not intend the
?? to be treated as a filename globbing pattern inside the
sh -c script, then use
sh -c 'TMP="??"; echo "$TMP"'