O mais provável é que sua segunda tentativa esteja correta, mas sua expectativa está errada.
Vamos ver em algumas partes:
crontab -l
lista todas as entradas existentes para o crontab do usuário atual. O
echo "1 * * * * /usr/bin/firefox"
apenas imprime essa linha novamente. Estes dois comandos são então agrupados em um subshell e a saída comum é canalizada para
crontab -
Assim, o crontab é sobrescrito pelo que vem através da entrada padrão, que neste caso é o crontab antigo mais a nova entrada.
Como você disse, ele é adicionado ao arquivo crontab. E, supondo que o daemon cron esteja em execução, o comando será executado a cada minuto.
Então, por que você não está vendo uma janela do firefox a cada minuto? - Como o conrjob é executado em um shell diferente abaixo do daemon do cron, que não tem acesso à sua sessão X, o firefox falhará e reportará algo como
(firefox:22376): Gtk-WARNING **: Locale not supported by C library.
Using the fallback 'C' locale.
Error: GDK_BACKEND does not match available displays
E termine. Como ver esse erro? Normalmente, o daemon do cron tentará enviar um email para você, veja /var/spool/mail
eventualmente.
Sobre as duas formas:
{ crontab -l; echo "1 * * * * /usr/bin/firefox" } | crontab -
teria que ser escrito como
{ crontab -l; echo "1 * * * * /usr/bin/firefox"; } | crontab -
(note o ponto e vírgula extra)
A diferença entre ()
e {}
é que o primeiro cria um sub-shell, enquanto o último executa os comandos no mesmo contexto do shell. Assim, as atribuições variáveis sobrevivem de uma forma, não da outra.