O básico que você precisa entender nesse caso entre as duas maneiras de redirecionar (> e >>) é:
>
Redireciona e substitui as informações para as quais elas foram apontadas. Isso acontece ao receber qualquer informação através do canal "|"
>>
Redireciona e concatena as informações para as quais foi apontada. Isso acontece ao receber qualquer informação através do canal "|"
Nos dois casos, se o arquivo não existir, ele será criado. Somente em ">>" as informações serão concatenadas se você executá-las novamente no mesmo arquivo. Com ">" você simplesmente substituiria tudo o que fez na primeira execução.
Mas aqui está o problema ao usar o mesmo arquivo de entrada que o arquivo de saída. Nesse caso específico, se você usar ">", removeria as informações que a parte "entrada" precisa analisar, uma vez que o arquivo de saída estaria "substituindo-o". Então em:
rev file.txt | cat > file.txt
O que realmente está acontecendo na "explicação em câmera lenta" é:
rev
se prepara para reverter o conteúdo file.txt
e enviá-lo para o canal
- Enquanto
rev
está enviando as informações para o pipe, ele o envia diretamente para cat
.
- Enquanto
cat
estiver recebendo as informações, ela será aplicada automaticamente ao file.txt
que foi definido.
- A palavra-chave aqui é "while", porque tudo está acontecendo ao mesmo tempo. Por favor, veja os excelentes comentários abaixo de Emil para entender melhor essa parte.
cat
não esperará para rev
canalizar o arquivo inteiro. Ele simplesmente começará no minuto em que a primeira parte da informação chegar, o que significa que, dependendo de qual símbolo você usou, ela abrirá uma conexão file.txt
.
- Nesse caso, desde que você usou o > em vez de >> , o shell truncará o arquivo de saída, o que significa que ele abrirá e limpará as informações
file.txt
enquanto aguarda a chegada das novas informações. Com >>, ele abriria uma conexão file.txt
e aguardaria novas informações na última linha detectada.
- Como a informação já foi limpa
file.txt
com > , rev
tentaria fazer seu trabalho e não obteria nada porque cat
excluía tudo em preparação para a nova informação.
Então, por que os outros trabalham depois de ler o acima? Por causa disso:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Aqui você está direcionando para o gato que está enviando as informações para outro arquivo. Nesse caso, o arquivo de entrada processado file.txt
não é o mesmo que o arquivo de saída file2.txt
. Depois que você está literalmente substituindo o todo file2.txt
com file.txt
, por isso, todo o processo feito pelo cat
foi excluída. Basicamente, toda a linha poderia ser simplificada, cp file.txt file2.txt
porque ela está fazendo a mesma coisa, pois file2.txt
no final perde rev
o mv
comando e é sobrescrita .
rev file.txt | cat >> file.txt
Nesse caso, você está concatenando as informações para o mesmo arquivo. Portanto, ele está apenas abrindo uma conexão com esse arquivo, mas não apagando as informações como vistas com um único > . O resultado final deve ser a informação original mais a informação invertida.
cat
fora como este:rev file.txt > file2.txt && mv file2.txt file.txt
. Este é um uso supérfluo decat
. Ao deixá-lo de fora, você poupa a geração de um processo extra.