A coisa básica que você precisa entender neste caso entre as duas formas de redirecionamento (> e > >) é:
>
Redireciona e sobrescreve as informações para as quais foi apontado. Isso acontece ao receber qualquer informação através do pipe "|"
> >
Redireciona e concatena para as informações para as quais foi apontado. Isso acontece ao receber qualquer informação através do pipe "|"
Em ambos os casos, se o arquivo não existir, ele será criado. Apenas em "> >" A informação será concatenada se você a executar novamente no mesmo arquivo. Com ">" você simplesmente sobrescreveria tudo o que você fez na primeira execução.
Mas aqui está o acordo ao usar o mesmo arquivo de entrada que o arquivo de saída. Nesse caso em particular, se você usar ">" você estaria removendo as informações que a parte de "entrada" precisa analisar, já que o arquivo de saída seria "sobrescrevendo-a". Então, em:
rev file.txt | cat > file.txt
O que está acontecendo na "explicação da câmera lenta" é:
-
rev
se prepara para reverter o conteúdo defile.txt
e enviá-lo para o canal - Enquanto
rev
está enviando as informações para o pipe, o pipe transmite diretamente paracat
. - Enquanto
cat
está recebendo as informações, elas serão aplicadas automaticamente aofile.txt
definido com. - A palavra-chave aqui é "while", porque tudo está acontecendo ao mesmo tempo. Por favor, veja os excelentes comentários abaixo por Emil para ter uma compreensão mais profunda sobre esta parte.
-
cat
não esperará querev
canalize todo o arquivo. Ele simplesmente iniciará no minuto em que a primeira parte das informações chegar, o que significa que, dependendo do símbolo que você usou, ele abrirá uma conexão comfile.txt
. - Nesse caso, como 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 de
file.txt
enquanto aguarda a chegada das novas informações. Com > > , ele abriria uma conexão comfile.txt
e aguardaria novas informações na última linha detectada. - Como as informações já foram limpas em
file.txt
com > ,rev
tentaria fazer seu trabalho e não receber nada porquecat
excluiu tudo em preparação para as novas informações. / li>
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á enviando para o cat que está enviando as informações para outro arquivo. Nesse caso, o arquivo de entrada processado file.txt
não é igual ao arquivo de saída file2.txt
. Depois disso, você está literalmente sobrescrevendo todo o file2.txt
com file.txt
, então todo o processo feito por cat
foi excluído. Basicamente, toda a linha poderia ser simplificada como cp file.txt file2.txt
porque está fazendo a mesma coisa, pois file2.txt
no final perde o rev
e é sobrescrito com o comando mv
.
rev file.txt | cat >> file.txt
Nesse caso, você está concatenando as informações no mesmo arquivo. Por isso, é só abrir uma conexão com esse arquivo, mas não apagar as informações como visto com um único > . O resultado final deve ser a informação original mais a informação invertida.