Os ~ e $ são elementos do prompt da linha de comando . Isso indica que seu computador (ou mais exatamente, eu acho, o shell que você está executando) está aguardando a entrada do usuário. É solicitando que você insira um comando.
O $ é meramente um separador ou divisor. Ele separa o prompt de comando do comando que o segue. Quando as pessoas escrevem coisas como $ sudo apt-get update (seu exemplo), elas estão simplesmente informando que o comando, neste caso sudo apt-get update , precisa ser inserido em um prompt de comando. Estritamente falando, talvez, o $ seja redundante neste contexto.
Outros separadores podem ser usados em outras situações. Por exemplo, # é usado para um shell raiz.
O ~ (chamado 'til') é um atalho para o seu diretório pessoal. Quando aparece em um prompt de comando, por exemplo, user@hostame:~$ , indica que o diretório de trabalho atual é seu diretório pessoal. Portanto, se você executar o comando list, ls , sem especificar nenhum diretório específico, ele listará o conteúdo do seu diretório pessoal.
(By the way, $HOME , não é um comando, como você sugere, mas sim uma variável de ambiente . Ele determina a localização do seu diretório home. Você pode ver o seu valor executando $ echo $HOME .)