sh chama o programa sh como intérprete e o -c sinalizador executa o seguinte comando conforme interpretado por este programa.
No Ubuntu, sh é geralmente ligado por links simbólicos a /bin/dash , o que significa que se você executar um comando com sh -c , o painel será usado para executar o comando em vez de bash. O shell chamado com sh depende do symlink - você pode descobrir com readlink -e $(which sh) . Você deve usar sh -c quando quiser executar um comando especificamente com esse shell em vez de bash.
Você pode usar essa sintaxe (o -c flag) com outros intérpretes também. Um uso clássico dele (apontado por @edwinksl é para contornar o problema do redirecionamento não funciona com o sudo (aqui você pode usar bash -c ou sh -c )
sudo sh -c 'echo "foo" > /home/bar'
vai escrever o arquivo bar contendo o texto foo to /home/ , enquanto sudo echo "foo" > /home/bar falha como explicado muito bem aqui
É importante usar "aspas simples" ao redor da string de comando, caso contrário, o shell atual tentará expandi-lo antes de ser passado para o intérprete que você chamou
por exemplo (com python até eu pensar em um comando que daria resultados diferentes em traço ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token '('
$ python3 -c 'print (35/7)'
5.0