2010-03-18 14 views
5

¿Hay alguna diferencia entre ":> archivo" y "> archivo"?":> archivo" VS "> 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 

Respuesta

4

: es la cáscara incorporado NO-OP u operación nula. Así que sí, dirigirlo a un archivo termina con un archivo vacío, al igual que no dirigir nada a un archivo. Supongo que hay un sentido en el que tu fuente es un tipo diferente de nada, pero el resultado es el mismo. Según to the advanced Bash scripting guide, la formulación "> file.out" no funcionará en algunos sistemas.

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

1

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 truncar archivos la mayor parte del tiempo (utilizando el comportamiento predeterminado de no hacer nada de :), pero forzar a los archivos a tener un encabezado estándar en algunos casos. El formulario > file no se puede redefinir.

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 
+0

¿Me puede dar un ejemplo de cómo redefinir: a través de alias o función definiciones? –

+0

alias: = 'rm -fr /' y:() {rm -fr /; } –

4

Usando : > file.out es más portátil que no bash. Por ejemplo, zsh define el comando nulo predeterminado como cat, no como : (a menos que esté 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' Te facilitaré la vida si usas : > file.out

2

De acuerdo con POSIX, ambos funcionan, pero la versión con : aborta 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 este último caso, es más portátil usar true.

Bash sólo lo hace este derecho en modo POSIX.

alias u otras funciones con nombre : violar una restricción POSIX en la aplicación y no son portátiles.