A sintaxe da tarefa cron é restrita a sh , portanto você não pode usar os Bashisms como ~ . Felizmente, a correção é fácil - basta substituí-la por $HOME . Da mesma forma, source precisa ser substituído por . (apenas um ponto).
É claro que os scripts que você fonte não deve usar a sintaxe Bash, se você pretende usá-los a partir de sh . Provavelmente, a correção mais fácil é migrar essas coisas para o script (ou criar um script de wrapper para o Cron ser executado).
Como dentro do seu script, você pode usar bash , se desejar, desde que a linha shebang esteja corretamente #!/bin/bash (ajuste o caminho se for necessário) em vez de #!/bin/sh .
Se você não gostar disso, por algum motivo, poderá inserir o Bash no arquivo crontab , especificando-o explicitamente:
* * * * * bash -c 'source ~/.bash_profile; source ~/.bashrc; ./myscript.sh'
Você deve conseguir ver source: command not found e export: command not found nos e-mails enviados por cron quando as coisas dão errado. Examinar a saída do erro é realmente importante para a solução de problemas.
Claro, se você tiver o padrão .bashrc no Ubuntu, ele será liberado imediatamente se você tentar obtê-lo a partir de um script não interativo. Talvez seja melhor colocar as configurações que você deseja em um uso não interativo em outro arquivo (talvez .profile , que será lido por sh por padrão)?