Cuando la salida de un comando se redirige a un archivo, el shell crea o trunca el archivo de salida antes de que se ejecute el comando, ¿hay alguna idea de qué gato foo> foo hace?En UNIX, ¿qué "cat file1> file1 hace?"
Respuesta
En todos los casos, el archivo se trunca. Esto se debe a que el shell dirige la redirección y abre el archivo para escribir antes de invocar el comando.
cat foo > foo
Las formas truncadas de concha y abre foo para escribir, establece la salida estándar al archivo, y luego ejecutivo de ["cat", "foo"]
.
GNU cat es inteligente y se niega a redirigir un archivo a sí mismo. Lo hace comprobando el par dispositivo/inode en los descriptores de archivos de entrada y salida; Puede leer los maravillosos detalles de bajo nivel en src/cat.c. Imprime un mensaje y se cierra.
BSD cat no tiene esa seguridad, pero como el archivo ya se ha truncado, no hay nada que leer, nada que escribir, y se detendrá.
Puede poner un poco de sabor a las cosas agregando en lugar de truncar.
echo hello > foo
cat foo >> foo
Ahora todo es lo mismo, excepto la cáscara se abre el archivo para anexar en lugar de truncar la misma.
GNU cat ve lo que hace y se detiene; el archivo no ha sido tocado
BSD cat entra en un bucle y agrega el archivo a sí mismo hasta que se llena el disco.
Y es por eso que Mac está basado en BSD. –
El archivo se trunca primero y luego se lee, por lo que este comando truncará el archivo.
Cuando traté de ejecutarlo Tengo esta advertencia:
gato: test.txt: archivo de entrada es el archivo de salida
¿Qué 'gato' de plataforma tienes? 'cat foo> foo' da como resultado un archivo' foo' vacío para mí. – birryree
En Fedora 13 esto es lo que veo
cat foo > foo
cat: foo: input file is output file
Si foo
contenía algo anteriormente, se va.
Shell truncará, cat
parecer comprueba un llamado Parm, pero no comprobará contra stdin
que a continuación y siempre tiene éxito:
$ uname -a
Linux bar 2.6.18-164.15.1.el5PAE #1 SMP Wed Mar 17 12:14:29 EDT 2010 i686 i686 i386 GNU/Linux
$ dd if=/dev/urandom of=foo bs=1024 count=4
4+0 records in
4+0 records out
4096 bytes (4.1 kB) copied, 0.00334456 seconds, 1.2 MB/s
$ od -c foo |head -2
0000000 U 371 003 z 224 334 z K 236 221 k < c 256 !
0000020 % % 256 V \ 005 , 254 X 202 330 004 222 " 037 226
$ cat <foo >foo && od -c foo
0000000
Gracias por todas sus respuestas. fueron muy útiles. – HelloWorld
- 1. Combinando echo y cat en Unix
- 2. reproducir el comando cat Unix en Python
- 3. ¿Cómo implemento `cat` en Haskell?
- 4. ¿Por qué no funciona el archivo "sort1> file1"?
- 5. Escribiendo cat en OCaml: uso de Unix.read
- 6. shell - cat - fusiona contenido de archivos en un gran archivo
- 7. Equivalente en git de "hg cat" o "svn cat"
- 8. ¿Es mejor que dd cat?
- 9. ¿Qué hace \ 1 en sed?
- 10. unix: cómo gato de 2 entradas?
- 11. ¿Cómo "cat" un archivo en JGit?
- 12. ¿Cómo puedo concatenar archivos en un subdirectorio con Unix find execute y cat en un solo archivo?
- 13. unix join separator char
- 14. ¿Por qué mi función "cat" con llamadas al sistema es más lenta en comparación con "cat" de Linux?
- 15. comparar dos archivos en UNIX
- 16. Utilice el comando UNIX JOIN para unir dos archivos
- 17. Usar cat para unir archivos mp3. ¿Qué es esta hechicería negra?
- 18. Cómo quitar el "./" principal en Unix "buscar"?
- 19. ¿Qué hace '@_' en Perl?
- 20. ¿Qué hace == en Ruby?
- 21. ¿Qué hace% en JavaScript?
- 22. ¿Qué hace% {} en Ruby?
- 23. Implementando tuberías en un caparazón C (Unix)
- 24. Fusionando dos archivos con cat sin línea nueva
- 25. La desactivación del comando cat
- 26. ¿Hay un reemplazo para cat en Windows
- 27. ¿Qué hace [:]?
- 28. cat archivo | ... vs ... <archivo
- 29. ¿qué es unix/linux internals?
- 30. ¿Qué es/dev/tty en UNIX?
Sospecho que esta sería una muy buena prueba del comportamiento del caparazón. –