Intenté rev
un archivo y luego lo canalicé cat > same_file
pero se estaba convirtiendo en un archivo en blanco.
Mientras lo intentaba rev file.txt | cat > file2.txt && mv file.txt file2.txt;
funcionó.
Incluso rev file.txt | cat >> file.txt;
funcionó.
Pero cuando lo intenté rev file.txt | cat > file.txt
falló.
command-line
redirect
Vintux
fuente
fuente
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.Respuestas:
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:
Lo que realmente sucede en la "explicación en cámara lenta" es:
rev
se prepara para revertir el contenidofile.txt
y enviarlo a la tuberíarev
envía la información a la tubería, la tubería la transmite directamente acat
.cat
recibe la información, la aplicará automáticamente a lafile.txt
que se configuró.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ónfile.txt
.file.txt
mientras espera que llegue la nueva información. Con >> abriría una conexión confile.txt
y esperaría nueva información sobre la última línea detectada.file.txt
con > ,rev
intentaría hacer su trabajo y no obtendría nada porquecat
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:
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 salidafile2.txt
. Después de eso, literalmente, va a sobrescribir el conjuntofile2.txt
confile.txt
, por lo que todo el proceso realizado porcat
fue suprimido. Básicamente, toda la línea podría simplificarse comocp file.txt file2.txt
porque está haciendo lo mismo, ya quefile2.txt
al final pierderev
y se sobrescribe con elmv
comando.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.
fuente
rev file.txt | cat --bogus-option > file.txt
también truncará el archivo, aunque cat no intentará abrirlo.moreutils
) que incluyesponge
, una herramienta diseñada específicamente para el uso de sobrescribir un archivo de entrada. Por ejemplo, larev file.txt >file2.txt && mv file2.txt file.txt
solución se convertiríarev file.txt | sponge file.txt
, lo que funcionará correctamente incluso cuando ya haya algo llamadofile2.txt
.Cuando el shell ve la redirección, primero abre los archivos relevantes, antes de ejecutar cualquiera de los comandos involucrados. Por lo tanto, cuando haces:
La redirección a
file.txt
hace que se trunca antes defoo
ejecutarse y poder leersefile.txt
. En una nota al margen, esta es la razón por la que no puede hacer:Y por qué
sed
tiene una opción de edición en el lugar.Por último, haciendo:
es un uso inútil del gato , especialmente si está intentando leer desde el
file.txt
principio.Si desea revertir un archivo en el lugar, no hay atajos . Es posible que pueda usar los trucos
sed
oawk
con la edición en el lugar.fuente
>
es un redirector (operador) que envía la salida a otra cosa(entrada del siguiente comando, impresora ...)
En su caso, la salida va a un archivo
file.txt
, si este archivo ya existe se sobrescribe, si no se crea.>>
es un operador de agregar, sifile.txt
ya existe, la salida se agrega al final del archivo. si el archivo no existe, se crea y la salida se escribe en el nuevo archivo, igual que>
(redirector).fuente
>
y>>
.Puede usar Vim en modo Ex:
%
seleccione todas las líneas!
ejecutar comandox
guardar y cerrarfuente