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
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top