Domanda
C'è qualche differenza tra ": file>" e "> file"
?$ : > 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
Soluzione
:
è il guscio incorporato NO-OP o un'operazione nulla. Quindi sì, dirigendola in un file finisce con un file vuoto, così come dirigere nulla in un file. C'è un senso, suppongo, in cui la sorgente è un diverso tipo di niente, ma il risultato è lo stesso. Secondo all'avanzato Bash scripting guida , il "> file.out
" formulazione non funziona su alcuni sistemi.
Si noti che in entrambi i casi (a differenza di "toccare") il contenuto del file saranno sostituiti con nulla se il file esiste già.
Altri suggerimenti
Utilizzando : > file.out
è più portabile di non-bash. Ad esempio, zsh definisce il null comando predefinito come cat
, non :
(se non in una modalità di emulazione). Se mai finire per dover far funzionare lo script con un /bin/sh
che non è bash (ad esempio, un sistema * BSD, qualsiasi sistema operativo closed-source, o anche su alcune distribuzioni GNU / Linux ora, in cui viene utilizzata trattino), è' ll rendere la vita più facile se si utilizza : > file.out
Secondo POSIX, sia il lavoro ma la versione con :
interrompe se il reindirizzamento fallisce mentre la versione con solo il reindirizzamento restituisce solo uno stato di uscita diverso da zero. In quest'ultimo caso è più portabile di utilizzare true
.
Bash solo questo diritto in modalità POSIX.
Gli alias o funzioni denominate :
violano un vincolo POSIX sulla domanda e non sono portatili.
L'unica differenza che posso pensare è che si può ridefinire :
tramite definizioni di alias o funzione. Ad esempio, si può decidere di troncare i file la maggior parte del tempo (che utilizzano il do-nothing comportamento predefinito di :
), ma forzare i file per avere un colpo di testa di serie in alcuni casi. La forma > file
non può essere ridefinito.
Ad esempio:
#! /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