Lo básico que debe comprender en este caso entre ambas formas de redireccionamiento (> y >>) es:
>
Redirige y sobrescribe la información a la que apuntaba. Esto sucede mientras recibe cualquier información a través de la tubería "|"
>>
Redirecciona y concatena la información a la que fue apuntada. Esto sucede mientras recibe cualquier información a través de la tubería "|"
En ambos casos, si el archivo no existe, se creará en su lugar. Solo en ">>" se concatenará la información si la vuelve a ejecutar en el mismo archivo. Con ">" simplemente sobrescribiría todo lo que hizo en la primera ejecución.
Pero aquí está el trato cuando se usa el mismo archivo de entrada que el archivo de salida. En ese caso particular, si usa ">", estaría eliminando la información que la parte de "entrada" debe analizar, ya que el archivo de salida estaría "sobrescribiéndola". Entonces en:
rev file.txt | cat > file.txt
Lo que realmente sucede en la "explicación en cámara lenta" es:
revse prepara para revertir el contenido file.txty enviarlo a la tubería
- Mientras
revenvía la información a la tubería, la tubería la transmite directamente a cat.
- Mientras
catrecibe la información, la aplicará automáticamente a la file.txtque se configuró.
- La palabra clave aquí es "while", porque todo está sucediendo al mismo tiempo. Vea los excelentes comentarios a continuación de Emil para tener una comprensión más profunda de esta parte.
catno esperará reva canalizar todo el archivo. Simplemente comenzará en el momento en que llegue la primera parte de la información, lo que significa que, según el símbolo que haya utilizado, abrirá una conexión file.txt.
- En este caso, dado que usó > en lugar de >> , el shell truncará el archivo de salida, lo que significa que se abrirá y borrará la información
file.txtmientras espera que llegue la nueva información. Con >> abriría una conexión con file.txty esperaría nueva información sobre la última línea detectada.
- Dado que la información ya se borró
file.txtcon > , revintentaría hacer su trabajo y no obtendría nada porque cateliminó todo en preparación para la nueva información.
Entonces, ¿por qué trabajan los demás después de leer lo anterior? Debido a esto:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Aquí está conectando a cat que está enviando la información a otro archivo. En este caso, el archivo de entrada procesado file.txtno es el mismo que el archivo de salida file2.txt. Después de eso, literalmente, va a sobrescribir el conjunto file2.txtcon file.txt, por lo que todo el proceso realizado por catfue suprimido. Básicamente, toda la línea podría simplificarse como cp file.txt file2.txtporque está haciendo lo mismo, ya que file2.txtal final pierde revy se sobrescribe con el mvcomando.
rev file.txt | cat >> file.txt
En este caso, está concatenando la información en el mismo archivo. Por lo tanto, solo abre una conexión a ese archivo pero no borra la información como se ve con un solo > . El resultado final debe ser, la información original más la información invertida.
catfuera de esta manera:rev file.txt > file2.txt && mv file2.txt file.txt. Este es un uso superfluo decat. Al dejarlo afuera, ahorras un proceso adicional.