¡Cómo ahorrar $ múltiples! en variables y usarlo más tarde en bash?

Quiero obtener los pids de dos procesos en segundo plano,

sleep 20 & pid1=$\!; sleep 10 & pid2=$\!; echo "pid1: $pid1, pid2: $pid2"

y obtener salida como a continuación:

[1] 124646
[2] 124648
pid1: $!, pid2: $!

la salida que deseaba obtener es como:

pid1: 124646, pid2: 124648

Alguien sabe por qué y puede ayudar a lograr esto?

[agregar 2018/01/02]

Perdón por la respuesta realmente tardía, una mano está ocupada, otra es que quiero verificar el guión.

El script real que quiero ejecutar es el siguiente:

sh -c "sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\""

y como informarábash: !: event not found, así que intenté agregar \ y convertirme en:

sh -c "sleep 20 & pid1=$\!; sleep 10 & pid2=$\!; echo \"pid1: $pid1, pid2: $pid2\""

y para simplificar el problema, simplemente me muevosh -c mientras que esto lo convierte en un problema bastante diferente.

para mi problema, descubrí que el siguiente script funcionará:

sh -c 'sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo "pid1: $pid1, pid2: $pid2"'

Sin embargo, hay otra pregunta, cómo hacer que el siguiente script funcione:

name='bob'
# below script reports 'bash: !: event not found' error
sh -c "echo $name; sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\"" 
# below script $name will not become bob
sh -c 'echo $name; sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\"' 

Respuestas a la pregunta(3)

Su respuesta a la pregunta