Na verdade, o segundo formulário touch filename não exclui nada do arquivo - ele apenas cria um arquivo vazio se não existir ou atualiza a data da última modificação de um arquivo existente.
E o terceiro filename < /dev/null tenta executar o nome do arquivo com /dev/null como entrada.
cp /dev/null filename funciona.
Como para eficiente, o mais eficiente seria truncate -s 0 filename ; veja aqui: link .
Caso contrário, cp /dev/null filename ou > filename estão bem. Ambos abrem e fecham o arquivo, usando a configuração truncar em aberto. cp também abre /dev/null , o que o torna marginalmente mais lento.
Por outro lado, truncate provavelmente seria mais lento que > filename quando executado a partir de um script, pois a execução do comando truncate exige que o sistema abra o executável, carregue-o e execute-o.