Quando si crea un file vuoto, perché si potrebbe preferire 'touch file' su ': >> file'?


33

Non ho mai capito che potresti farlo fino ad ora:

: >> file

Sembra essere funzionalmente simile a:

touch file

C'è un motivo per cui la maggior parte delle risorse sembra preferire il tocco rispetto a questa shell incorporata?


7
La forma abbreviata può essere correlata alla shell, mentre touch è un comando autonomo. Quindi la forma abbreviata dipende dalla shell che usi (e le persone hanno forti preferenze in quest'area) poiché forse non tutte forniscono la scorciatoia. touchessere autonomo funzionerà allo stesso modo qualunque cosa tu debba usare.
Patrick Mevzek,


6
Il primo esempio dovrebbe essere modificato : >> fileo addirittura >> file, in modo che abbiano lo stesso effetto, ovvero NON distruggere il contenuto del file.
user000001,

2
touchaggiorna principalmente il mtime. Diversamente, non svuota un file esistente >.
rexkogitans,

2
Nessuno dei due comandi "crea un file vuoto"; hanno questo risultato solo se il file non esiste ancora. Per garantire un file vuoto, è necessario > file.
alexis,

Risposte:


47

Non hai nemmeno bisogno di usare :; puoi semplicemente > file(almeno in bash; altre shell possono comportarsi diversamente).

In termini pratici, non vi è alcuna reale differenza qui (anche se il minimo sovraccarico di chiamare /bin/touchè una cosa).

touch, tuttavia, può anche essere utilizzato per modificare i timestamp su un file che esiste già senza cambiare o cancellare il contenuto; inoltre, > filespazzerà via tutto fileciò che esiste già. Questo può essere aggirato invece usando >> file.

Un'altra differenza touchè che puoi far sì che crei (o aggiorni il timestamp su) più file contemporaneamente (ad es. touch foo bar baz quux) Con una sintassi più concisa rispetto al reindirizzamento, dove ogni file ha bisogno del proprio reindirizzamento (ad es >foo >bar >baz >quux.).

Utilizzando touch:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

Utilizzando il reindirizzamento:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018

6
Sembra >> fileche non aggiornerà il tempo di modifica. Non è ciò che OP sta cercando, ma volevo solo sottolineare che non sembra essere un'alternativa completa al tocco.
Jesse_b,

2
Poiché la domanda non specifica una shell particolare. Potrebbe essere utile sottolineare che > filein zsh equivale a cat > fileno : > file.
JoL

Inoltre, tcsh lo consente : > file, ma fa errori > file. Forse l'equivalenza di > fileto : > fileè limitata alla shell bourne e bash?
JoL

+1 per completezza, tuttavia notare che in diverse conchiglie tradizionali (avrei nemmeno immaginare tutte o la maggior parte delle conchiglie perché l'implementazione più semplice sarebbe naturalmente causare questo lavoro come un effetto collaterale), si può toccare più file utilizzando il reindirizzamento della shell: : >foo >baro : >>foo >>barlo faranno toccare entrambi fooe bar.
mtraceur,

Solo per essere pedanti a causa del contesto della domanda reale qui, ma : >foo >barnon touchi file; reindirizzerà l'output (null) di : nei file. touchtoccherebbe i file. (:
DopeGhoti

32

Perché puoi touchpiù file in una volta sola senza digitare caratteri speciali extra. Ciò include cose come l'espansione del tutore, ad es touch file{1,2,3,4}.

Un altro problema è che quando stai scrivendo un tutorial, è piuttosto importante rendersi conto che i tuoi lettori probabilmente non sono molto esperti nell'argomento. Un semplice comando può essere molto più comprensibile di una strana combinazione di caratteri non-lettera. Mi aspetto che ci siano un certo numero di utenti casuali di shell che non sanno cosa :sia, per la semplice ragione che in realtà non fa nulla. Allo stesso modo per una pianura > foosenza un comando: anche se sai cos'è un reindirizzamento, un reindirizzamento senza una fonte potrebbe non essere intuitivo.

Inoltre, qui su unix.se scriviamo spesso esempi di comandi con un segno di dollaro iniziale per indicare il prompt. I caratteri speciali all'inizio della riga potrebbero essere confusi con quello. (Notare che ci sono sistemi e shell che usano >come parte del prompt predefinito.)


4
E se il comando non è completamente compreso, c'è sempre "man touch". Dubito che "man:> file" restituirebbe qualcosa di utile :-) Inoltre, i prompt di WRT, alcuni (forse la maggior parte) ti consentono di impostare il prompt in modo che sia qualsiasi cosa ti piaccia. Il mio mostra il nome del sistema (perché uso molti xterm remoti) e la directory corrente, ed è impostato su colori diversi per sistemi diversi.
jamesqf,

1
@jamesqf, sì. Ora, ovviamente, c'è anche help :o qualunque cosa la tua shell abbia per la documentazione. Ma ciò richiede il riconoscimento :come comando in sé, ricordando che non tutto ha una pagina man e, infine, essere in grado di trovare :nella documentazione. L'ultima parte può essere piuttosto difficile. : D
ilkkachu,

@jamesqf, e sì, intendevo principalmente il carattere finale del prompt predefinito.
ilkkachu,

1
+1 per indicare l' intuizione e gli aspetti di non essere un oscuro costrutto.
mtraceur,

@ilkkachu: Sì. Trovare i due punti nella documentazione non è così difficile: trovare quello che non è solo la punteggiatura è una questione diversa :-)
jamesqf

18

Bene, per me, il motivo principale è la leggibilità. Con touch filesai cosa sta succedendo, anche qualcuno che non è abbastanza istruito negli script di shell sa cosa sta succedendo. E se no, è facile da fare man touche vedere questo:

A FILE argument that does not exist is created empty

Con le cose criptiche come :e >, è più difficile sapere cosa sta succedendo e poiché non c'è alcun vantaggio reale, non è necessario utilizzarlo.


6

Immagina di essere alla ricerca di uno dei tuoi vecchi script shell di cui ricordi solo che è stato creato un file marker in / tmp. È facile eseguire il grep di tutti i tuoi file * .sh per la parola "touch". Il grepping per i due punti invece produrrà molti falsi positivi se non sai quale nome esatto di file cercare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.