Qual è la differenza nell'uso di "touch file" e "> file" nella creazione di un nuovo file?


13

Sono nuovo di Linux. Quando ho creato un nuovo file .gitignore nella directory corrente usando bash, ho scoperto che posso fare:

> .gitignore

o

touch .gitignore

Sembra che facciano la stessa cosa. Quando controllo il manuale touch, dice che cambia il timestamp per il file corrente, ma non esiste un manuale per >. Qualcuno può spiegare cosa può >fare e c'è qualche differenza nell'uso di questi due comandi in questo contesto? Grazie.


1
Sono curioso di sapere dove hai imparato a usare '>' come generatore di file senza apprenderne l'uso previsto
forresthopkinsa

1
Troverai il reindirizzamento documentato nel manuale di Bash. Alla riga di comando, immettere il comando man bash. È un documento lungo e ci vorranno giorni o addirittura settimane per capire bene, ma vale la pena leggere se vuoi imparare Bash a fondo.
Paddy Landau,

Risposte:


21

>è l'operatore di reindirizzamento della shell. Vedi Qual è la differenza tra ">" e ">>" nel comando shell? e quando dovrei usare <o <() o << e> o> ()?Viene utilizzato principalmente per reindirizzare l'output di un comando su un file. Se il file non esiste, la shell lo crea. Se esiste, la shell lo tronca (lo svuota). Con just > file, non esiste alcun comando, quindi la shell crea un file, ma non viene inviato alcun output, quindi l'effetto netto è la creazione di un file vuoto o lo svuotamento di un file esistente.

touchè un comando esterno che crea un file o aggiorna il timestamp, come già sapete. Contouch , il contenuto del file non viene perso, se esiste, a differenza di >.

Il comportamento di >dipende dalla shell. In bash, dash e la maggior parte delle shell > foofunzionerà come previsto. In zsh, per impostazione predefinita, > foofunziona come cat > foo- zsh ti aspetta digitando input.


10
Il punto chiave qui è che non esiste alcuna differenza pratica tra >> filee, touch filema se filenon esiste, c'è una grande differenza tra entrambi e > file(in quanto i contenuti precedenti di filevengono persi). Questo, oltre al comportamento incoerente di zsh, touch fileè il "più sicuro" e quindi dovrebbe essere memorizzato come il modo giusto di farlo.
Monty Harder,

1

Ecco un confronto interessante:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Risultato:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472

1
Mentre il confronto potrebbe essere interessante, non vedo davvero quello che vuoi che io veda qui. Puoi spiegare cosa stai cercando? Immagino che sia un modo diverso di scrivere cose nei file, ma lo trovo un po 'confuso in questo modo. Potrebbe essere la mia mancanza di caffè però.
m00

@ m00am ciò che viene mostrato qui è effettivamente 8 diversi modi per creare un file. stracesi suppone che mostri le chiamate di sistema che vengono eseguite e il > file.txtmetodo viene mostrato come il minor numero di chiamate di sistema eseguite, il che non è poi così sorprendente - più uno strumento è complesso, più complesse sono le sue syscall. Il problema con gli esempi mostrati, tuttavia, è che stracescrive in stderrstreaming per impostazione predefinita, e in questa risposta Steven usa pipe per leggere solo stderr, quindi sono leggermente confuso su come ha contato le linee usando |pipe e non|&
Sergiy Kolodyazhnyy

E su Ubuntu 16.04, usando |&, come cita @Serg, ottengo conteggi di circa un quinto di quelli qui ... eccetto il vicaso, in cui ottengo circa lo stesso valore
muru

WSL? Woah ... Non pensavo che WSL avrebbe aggiunto che molte chiamate di sistema per quello che faceva.
Muru,

@muru Cygwin - WSL non è ancora pronto stackoverflow.com/a/40370009
Steven Penny
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.