Pregunta

¿Hay alguna diferencia entre ":> archivo" y "> archivo"?

$ : > file.out
$ ls -l file.out
-rw-rw----   1 user    user             0 Mar 18 21:08 file.out
$ > file.out
$ ls -l  file.out
-rw-rw----   1 user    user             0 Mar 18 21:08 file.out
¿Fue útil?

Solución

: es la cáscara incorporado NO-OP u operación nula. Así que sí, dirigiéndola a un archivo termina con un archivo vacío, al igual que la dirección de la nada a un archivo. Hay un sentido, supongo, en el que la fuente es un tipo diferente de nada, pero el resultado es el mismo. Según a la avanzada Bash scripting guía , "> file.out" formulación no funcionará en algunos sistemas.

Tenga en cuenta que en ambos casos (a diferencia de "toque") el contenido del archivo serán reemplazados por nada si el archivo ya existe.

Otros consejos

Uso : > file.out es más portátil que no bash. Por ejemplo, zsh define el null-comando predeterminado como cat, no : (a menos que en un modo de emulación). Si alguna vez terminas tener que hacer el trabajo de la escritura con un /bin/sh que no es fiesta (por ejemplo, un sistema * BSD, cualquier sistema operativo de código cerrado, o incluso en algunas distribuciones de GNU / Linux, donde se utiliza un guión), que' ll hacer su vida más fácil si utiliza : > file.out

Según POSIX, ambos funcionan pero la versión con : se cancela si la redirección falla, mientras que la versión con solo la redirección simplemente devuelve un estado de salida distinto de cero.En el último caso es más portátil de usar. true.

Bash sólo hace esto correctamente en modo POSIX.

Alias ​​o funciones nombradas : violan una restricción POSIX en la aplicación y no son portátiles.

La única diferencia que se me ocurre es que se puede redefinir : a través de alias o función definiciones. Por ejemplo, es posible que desee para truncar los archivos de la mayoría del tiempo (utilizando el no hacer nada comportamiento predeterminado de :), pero obligar a los archivos para tener un encabezado estándar en algunos casos. La forma > file no puede ser redefinido.

Por ejemplo:

#! /bin/bash

test -n "$ADD_COPYRIGHT" &&
  :() { echo "# Copyright (c) 2010 MyName"; echo; }

# Truncate the file to zero size, unless ADD_COPYRIGHT is set, in which case
# the file is truncated to contain only a copyright notice.
: > file

# Add content to the file
some_command >> file
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top