Isso acontece porque o arquivo de entrada / saída é truncado antes que seu conteúdo seja realmente lido, portanto sort acaba lendo um arquivo já vazio.
Em geral (isto é, ao redirecionar a saída de um comando para seu arquivo de entrada, já que esse problema não ocorre apenas com sort ), você pode executar o comando necessário dentro de uma subshell e armazenar sua saída em uma variável, em seguida, libere o conteúdo da variável para o arquivo (por exemplo, com echo ), desta forma atrasando o truncamento do arquivo de entrada / saída para um ponto em que o arquivo de entrada já foi lido:
tmp=$(sort test) && echo "$tmp" > test
Observe também que isso não é muito eficiente para arquivos grandes, e que o operador && foi escolhido no lugar de ; para evitar o truncamento do arquivo de entrada / saída em caso de falha do primeiro comando .