De acordo com meus testes no Debian Wheezy, todos os 3 cenários podem levar a ambos os resultados (arquivo1 é classificado e escrito de volta para si mesmo OU nada é classificado e nada é gravado no arquivo1.
Eu acredito que este é um comportamento normal e vem da maneira como o Linux trabalha com arquivos. Pense no comando - o comando sort começa a ler o arquivo1 e envia imediatamente sua saída para tee. Tee lê a saída, grava de volta no arquivo1 e imprime em / dev / null. Caso a ordenação seja rápida o suficiente para ler todo o arquivo1, o resultado final é ordenado. Mas no caso tee recebe o bloqueio no arquivo, ele apaga-lo (tee sempre apaga o arquivo de saída, exceto quando a opção append é usada) e isso é muito bonito o que está acontecendo em todos os seus 3 cenários.
Para torná-lo mais curto, digamos, às vezes, o tipo não é rápido o suficiente para ler o arquivo1. Nesse caso, tee apaga o arquivo ANTES que a classificação possa lê-lo.
Eu recomendaria o seguinte procedimento:
cat file1 | sort > /tmp/sorting.tmp; mv /tmp/sorting.tmp file1
Caso você queira ver a saída classificada no stdout, faça assim:
cat file1 | sort | tee /tmp/sorting.tmp; mv /tmp/sorting.tmp file1
Não é uma boa idéia deixar dois comandos diferentes trabalhando com 1 arquivo em sistemas multiprocessadores - você nunca pode ter certeza de qual deles será executado primeiro. Em um único sistema encadeado, o comportamento seria diferente - sequencial.