A maneira correta de fazer isso é usar
if /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes" ; then
exec prog1
else
exec prog2
fi
O argumento -q para o grep descartará o stdout e a instrução if verificará o status do comando executado. [ /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes" ] não é um comando válido, porque [ é na verdade um programa que aceita argumentos como o grep. Portanto, [ não consegue entender /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes" e isso falha.