1) Why do we need the curly brackets
Porque você precisa canalizar a saída de cat e a saída de echo para crontab - . Sem as chaves, não é possível montar a saída dos dois comandos em um único pipe.
(or can we use single quotes) here
Não. ... | 'cat; echo "0 0 * * * /path/to/cron/job"' | ... significa "pipe para um executável chamado cat; echo "0 0 * * * /path/to/cron/job" ". Isso não faz sentido.
2) And why do we need the
cat;command here?
Você não faz. Você poderia ter escrito a mesma coisa com mais eficiência do que:
{ crontab -l; echo '0 0 * * * /path/to/cron/job'; } | crontab -
3)
crontab -. If my understanding is correct, does-get replaced by the output of the previous command in the pipeline?
Sim, mas isso porque crontab suporta especificamente isso. Usar - para significar stdin e / ou sdtout é uma convenção compreendida por muitos comandos, mas é apenas uma convenção. Não é obrigatório pelo shell, como, por exemplo, >file ou | command .