Intenté revun archivo y luego lo canalicé cat > same_filepero 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.txtfalló.
command-line
redirect
Vintux
fuente
fuente

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.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:
revse prepara para revertir el contenidofile.txty enviarlo a la tuberíarevenvía la información a la tubería, la tubería la transmite directamente acat.catrecibe la información, la aplicará automáticamente a lafile.txtque se configuró.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ónfile.txt.file.txtmientras espera que llegue la nueva información. Con >> abriría una conexión confile.txty esperaría nueva información sobre la última línea detectada.file.txtcon > ,revintentaría hacer su trabajo y no obtendría nada porquecateliminó 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.txtno es el mismo que el archivo de salidafile2.txt. Después de eso, literalmente, va a sobrescribir el conjuntofile2.txtconfile.txt, por lo que todo el proceso realizado porcatfue suprimido. Básicamente, toda la línea podría simplificarse comocp file.txt file2.txtporque está haciendo lo mismo, ya quefile2.txtal final pierderevy se sobrescribe con elmvcomando.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.txttambié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.txtsolució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.txthace que se trunca antes defooejecutarse y poder leersefile.txt. En una nota al margen, esta es la razón por la que no puede hacer:Y por qué
sedtiene 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.txtprincipio.Si desea revertir un archivo en el lugar, no hay atajos . Es posible que pueda usar los trucos
sedoawkcon 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.txtya 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 comandoxguardar y cerrarfuente