« :> Fichier » VS « > fichier »
Question
Y at-il des différences entre ":> fichier" et "> fichier"
?$ : > 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
La solution
:
est la coquille intégré NO-OP ou opération nulle. Alors oui, la diriger vers un fichier se termine avec un fichier vide, tout comme dirigeant rien à un fichier. Il y a un sens, je suppose, dans lequel votre source est un autre type de rien, mais le résultat est le même. Selon au guide script Bash avancé , le "> file.out
" la formulation ne fonctionnera pas sur certains systèmes.
Notez que dans les deux cas (contrairement à « toucher ») le contenu du fichier sera remplacé par rien si le fichier existe déjà.
Autres conseils
Utilisation : > file.out
est plus portable non bash. Par exemple, zsh définit le null-commande par défaut en tant cat
, non :
(sauf dans un mode d'émulation). Si vous finissez toujours par avoir besoin de faire fonctionner le script avec un /bin/sh
qui n'est pas bash (par exemple, un système BSD *, tout système d'exploitation à code source fermé, ou même sur certaines distributions GNU / Linux maintenant, où tiret est utilisé), vous ll vous rendre la vie plus facile si vous utilisez : > file.out
Selon Posix, les deux fonctionnent, mais la version avec :
avorte si la redirection échoue alors que la version avec juste la redirection retourne juste un état de sortie non nul. Dans ce dernier cas, il est plus portable à utiliser true
.
Bash seulement ce droit en mode POSIX.
Les alias ou les fonctions nommées :
violent une contrainte POSIX sur l'application et ne sont pas portables.
La seule différence que je peux penser est que vous pouvez redéfinir :
via les définitions d'alias ou de fonction. Par exemple, vous pouvez tronquer les fichiers la plupart du temps (en utilisant le comportement par défaut ne rien de :
), mais les fichiers forcer à un en-tête standard dans certains cas. La forme > file
ne peut être redéfinie.
Par exemple:
#! /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