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 .