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:
rev
se prepara para revertir el contenido file.txt
y enviarlo a la tubería
- Mientras
rev
envía la información a la tubería, la tubería la transmite directamente a cat
.
- Mientras
cat
recibe la información, la aplicará automáticamente a la file.txt
que 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.
cat
no esperará rev
a 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.txt
mientras espera que llegue la nueva información. Con >> abriría una conexión con file.txt
y esperaría nueva información sobre la última línea detectada.
- Dado que la información ya se borró
file.txt
con > , rev
intentaría hacer su trabajo y no obtendría nada porque cat
eliminó 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.txt
no es el mismo que el archivo de salida file2.txt
. Después de eso, literalmente, va a sobrescribir el conjunto file2.txt
con file.txt
, por lo que todo el proceso realizado por cat
fue suprimido. Básicamente, toda la línea podría simplificarse como cp file.txt file2.txt
porque está haciendo lo mismo, ya que file2.txt
al final pierde rev
y se sobrescribe con el mv
comando.
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.
cat
fuera 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.