Al crear un archivo vacío, ¿por qué podría preferirse 'tocar archivo' sobre ': >> archivo'?

33

Nunca me di cuenta de que podía hacer esto hasta ahora:

: >> file

Parece ser funcionalmente similar a:

touch file

¿Hay alguna razón por la cual la mayoría de los recursos parecen preferir el tacto sobre este shell incorporado?

Harold Fischer
fuente
77
La forma abreviada puede estar relacionada con el shell, mientras que el toque es un comando independiente. Por lo tanto, la forma abreviada depende de qué shell use (y las personas tienen fuertes preferencias en esta área), ya que tal vez no todos proporcionen el acceso directo. touchser independiente funcionará de la misma manera, sea lo que sea que use.
Patrick Mevzek,
66
El primer ejemplo debe editarse : >> fileo incluso >> file, de modo que tengan el mismo efecto, es decir, NO destruyan el contenido del archivo.
user000001
2
touchactualiza principalmente el mtime. No vacía un archivo existente a diferencia >.
rexkogitans
2
Ninguno de los comandos "crea un archivo vacío"; solo tienen este resultado si el archivo aún no existe. Para garantizar un archivo vacío, necesita > file.
alexis

Respuestas:

47

Ni siquiera necesitas usar :; puede simplemente > file(al menos en bash; otros shells pueden comportarse de manera diferente).

En términos prácticos, no hay una diferencia real aquí (aunque la minúscula sobrecarga de llamar /bin/touches una cosa).

touch, sin embargo, también se puede usar para modificar las marcas de tiempo en un archivo que ya existe sin cambiar o borrar el contenido; Además, > fileeliminará cualquier fileque ya exista. Esto se puede solucionar usando en su lugar >> file.

Otra diferencia touches que puede hacer que cree (o actualice la marca de tiempo) múltiples archivos a la vez (por ejemplo touch foo bar baz quux) con una sintaxis más sucinta que con la redirección, donde cada archivo necesita su propia redirección (por ejemplo >foo >bar >baz >quux).

Utilizando touch:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

Usando la redirección:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
DopeGhoti
fuente
66
Parece >> fileque no actualizará el tiempo de modificación. No es lo que OP está buscando, pero solo quería señalar que no parece ser una alternativa completa al tacto.
Jesse_b
2
Dado que la pregunta no especifica un shell particular. Puede ser bueno señalar que > fileen zsh es equivalente a cat > file, no : > file.
JoL
Además, tcsh permite : > file, pero se equivoca > file. ¿Quizás la equivalencia de > fileto : > filese limita al bourne shell and bash?
JoL
+1 por minuciosidad, sin embargo, tenga en cuenta que en varios shells convencionales (incluso adivinaría todos o la mayoría de los shells porque la implementación más simple naturalmente haría que esto funcione como un efecto secundario), puede tocar múltiples archivos usando la redirección de shell: : >foo >baro lo : >>foo >>barhará tocar ambos fooy bar.
mtraceur
Solo para ser pedante debido al contexto de la pregunta real aquí, pero : >foo >barno lo harán touchlos archivos; redirigirá la salida (nula) de : a los archivos. touchtocaría los archivos. (:
DopeGhoti
32

Porque puedes hacer touchmúltiples archivos de una vez sin tener que escribir caracteres especiales adicionales. Eso incluye cosas como la expansión de llaves, por ejemplo touch file{1,2,3,4}.

Otro problema es que cuando escribe un tutorial, es bastante importante darse cuenta de que sus lectores probablemente no estén muy versados ​​en el tema. Un comando simple puede ser mucho más comprensible que una combinación extraña de caracteres que no son letras. Esperaría que haya varios usuarios casuales de shell que no saben qué :es, por la sencilla razón de que realmente no hace nada. Del mismo modo para un plano > foosin un comando: incluso si sabe lo que es una redirección, una redirección sin una fuente puede no ser intuitiva.

Además, aquí en unix.se a menudo escribimos muestras de comandos con un signo de dólar inicial para indicar la solicitud. Los caracteres especiales al comienzo de la línea pueden confundirse con eso. (Tenga en cuenta que hay sistemas y shells que se usan >como parte de la solicitud predeterminada).

ilkkachu
fuente
44
Y si el comando no se comprende completamente, siempre hay "toque de hombre". Dudo que "man:> file" devuelva algo útil :-) También mensajes WRT, algunos (quizás la mayoría) le permiten configurar el mensaje para que sea lo que quiera. El mío muestra el nombre del sistema (porque uso muchos xterms remotos) y el directorio actual, y está configurado en diferentes colores para diferentes sistemas.
jamesqf
1
@jamesqf, sí. Ahora, por supuesto, también hay help :o lo que tenga su shell para la documentación. Pero eso requiere reconocerlo :como un comando en sí mismo, recordar que no todo tiene una página de manual y, finalmente, poder encontrarlo :en la documentación. La última parte puede ser bastante difícil. : D
ilkkachu
@jamesqf, y sí, me refería principalmente al carácter final de la solicitud predeterminada.
ilkkachu
1
+1 por señalar los aspectos de intuición y no ser una construcción oscura.
mtraceur
@ilkkachu: Sí. Encontrar puntos en la documentación no es tan difícil: encontrar uno que no sea solo puntuación es un asunto diferente :-)
jamesqf
18

Bueno, para mí, la razón principal es la legibilidad. Una vez touch fileque sepa lo que está sucediendo, incluso alguien que no esté bien educado en scripting de shell sabe lo que está sucediendo. Y si no, es fácil de hacer man touchy ver esto:

A FILE argument that does not exist is created empty

Con las cosas crípticas como :y >, es más difícil saber qué está sucediendo, y como no hay una ventaja real, no hay necesidad de usar eso.

yo'
fuente
6

Imagine que está buscando uno de sus viejos scripts de shell del cual solo recuerda que se está creando algún archivo marcador en / tmp. Es fácil seleccionar todos sus archivos * .sh para la palabra "touch". En cambio, buscar un colon generará muchos falsos positivos si no sabe qué nombre de archivo exacto buscar.

B de C
fuente