Risposte:
touch
ing prima il file conferma che hai effettivamente la possibilità di creare il file, piuttosto che perdere tempo in un editor solo per scoprire che il filesystem è di sola lettura o qualche altro problema.
:w
prima cosa dopo aver iniziato vi
però. (e :chmod +x %
se vuoi renderlo eseguibile)
touch
potrebbe non riuscire dove vi
's :w!
sarebbero riusciti anche se (per esempio se file
esiste ma non sei il suo proprietario e non hanno accesso in scrittura ad esso, mentre si ha accesso in scrittura alla directory corrente). Al contrario, touch
potrebbe riuscire ma vi
's :w
o :w!
potrebbe non riuscire se siete proprietario del file, ma non hanno accesso in scrittura ad esso né alla directory corrente (si sarebbe in grado di lavorare intorno ad esso con :!chmod +w %
(alcune vi
implementazioni come vim
può fare che automaticamente su :w!
)).
"foo" [readonly]
. E di nuovo quando si accede alla modalità di inserimento:Warning: Changing a readonly file.
Oltre alle risposte fornite, un vantaggio del tocco è che qualsiasi altro utente / terminale che modifica lo stesso file mentre lo si tocca, riceverà un avviso quando tentano di salvare eventuali modifiche.
WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?
Questo li avviserebbe anche se non hai apportato alcuna modifica e hai solo toccato il file.
A parte la risposta accettata:
Vale la pena notare che touch
viene utilizzato per aggiornare i timestamp dei file. Se lo usi touch
su un file esistente, aggiornerà il timestamp dei file alla data e ora correnti. Se il file non esiste, crea un file vuoto con la data e l'ora correnti come data e ora.
vi
d'altra parte, non crea un nuovo file a meno che non ci si scriva.
Ad esempio, se ho digitato vi test.txt
, digitato alcune note, quindi digitato :q!
; test.txt
non esisterebbe.
Senza touch
, un nuovo file non esisterà fino a quando non dici vi
di scriverlo.
Considera un sistema multiutente (forse sei su un filesystem montato in rete condiviso da molti sistemi ciascuno con molti utenti). L'esecuzione touch
assicurerà di avere il file (e che puoi scriverlo) e aggiorna anche il timestamp. Un altro utente che desidera creare un file di questo tipo vedrà che lo possiedi. Se esiste già e un altro utente desidera eliminarlo o sostituirlo, vedrà che è stato modificato di recente e forse penserà due volte.
Non vi è alcun vantaggio touch
nell'ing prima; vi
creerà il file se non esiste.
La risposta accettata dice che controlla se puoi scrivere lì prima di perdere tempo in un editor. È vero, ma ora perderai tempo a scrivere touch
ogni volta. Non essere in grado di scrivere da qualche parte è abbastanza eccezionale rispetto a quanto spesso funzionerà (purché ti ricordi sudo
di file fuori dalla tua home directory o /tmp
, o sei loggato come root).
Apri l'editor e fai quello che vuoi, quindi prova a salvare il file. Se non funziona, anche con :w!
, salvalo altrove ( :w ~/asdf
) e risolvi il problema. Una volta che è fisso, è possibile copiare il contenuto del file dal file temporaneo con l'originale: cat ~/asdf > /mnt/example.txt && rm ~/asdf
. Il motivo che utilizziamo cat
anziché mv
o cp
è utilizzare le autorizzazioni della destinazione e altri attributi.
Inoltre, per un uso più avanzato della riga di comando, è possibile eseguire lo sfondo vi
con Ctrl+ Zmentre si risolve il problema (o utilizzare :suspend
, o :sus
) e infine fg
eseguirlo nuovamente per eseguire il comando di scrittura.
Modifica: post migliorato in risposta ai commenti di / u / G-Man . Grazie!
/mnt/example.txt
non dovrebbe essere leggibile in tutto il mondo, ma la tua umask è impostata su qualcosa di permissivo come 22, allora /tmp/asdf
sarà leggibile in tutto il mondo. Se nel sistema sono presenti altre persone, potrebbero essere in grado di leggere la copia temporanea del file. (2) /mnt/example.txt
Probabilmente il file non dovrebbe essere scrivibile in tutto il mondo, ma, se ci sono persone dannose nel sistema, potrebbero essere in grado di leggere la copia temporanea del file e sostituirla con una versione modificata prima di spostarla / copiarla torna nel posto giusto. ... (proseguendo)
/tmp
potrebbe impedirlo.) (3) Il comando mv /tmp/asdf /mnt/example.txt
distruggerà totalmente la corrente /mnt/example.txt
e la sostituirà con /tmp/asdf
. Si desidera sostituire il contenuto di /mnt/example.txt
con il contenuto di /tmp/asdf
. Usando mv
, hai impostato /mnt/example.txt
gli stessi attributi di /tmp/asdf
- probabilmente di tua proprietà e leggibili in tutto il mondo. Potrebbe essere meglio cp /tmp/asdf /mnt/example.txt
o addirittura cat /tmp/asdf > /mnt/example.txt
. ... PS (4) È possibile sospendere vi
digitando :suspend
(o :sus
, in breve).
/tmp
, ma non ci sono scuse per non scrivere ~/
invece. Inoltre non avevo pensato che avrebbe sostituito gli attributi. Modificherò il mio post, grazie :)
vi
è un editor di testo visivo (vi = visual) È comunque visivo rispetto a "ed", che ti consente di vedere e modificare una riga di testo alla volta.
Il touch
comando aggiorna il timestamp su un file esistente o crea un nuovo file se il file non esiste già. È utile per testare cose che dipendono fortemente dai timestamp.
Ora se il tuo file è un file di testo o non esiste ancora, aprendolo con vi, quindi eseguendo il comando :wq
su vi, si otterrebbe lo stesso risultato del tocco di quel file. Questo è l'unico modo in cui i due comandi sono simili.
Specificamente per l'uso con vi
, non è necessario creare il file prima di modificarlo: vi
può essere utilizzato per creare e salvare un nuovo file. Tuttavia, esistono contesti di chiamata in cui il file deve esistere. Ad esempio, sul mio sistema (OS X) posso avviare un editor GUI appropriato (determinato dal tipo di file) in questo modo:
open foo.txt
Questo si aprirà foo.txt
in TextEdit, o in emacs, o in qualunque cosa io abbia specificato come editor preferito per i file di testo, e staccherebbe il processo in modo da ottenere immediatamente il mio prompt. ( open bar.py
potrebbe aprirlo in IDLE, nell'editor python; ecc.) Oppure posso richiedere esplicitamente emacs:
open -a emacs foo.txt
Ma open
richiede che il file esista già, altrimenti genera un errore. Quindi ho dovuto definire emacs
la seguente funzione shell, che mi consente di scrivere emacs foo
per avviare la emacs
GUI anche se foo
non esiste.
function emacs ()
{
if [ -n "$1" -a ! -e "$1" ]; then
/usr/bin/touch "$1";
fi;
open -a emacs "$@"
}
vi è usato per modificare un file come utente, mentre touch può impostare il timestamp su di esso ed è principalmente usato negli script e simili.
Un altro modo per creare un file è:
>newfile.txt
zsh
, è identico cat >newfile.txt
e deve essere premuto Ctrl + D.
Dalla pagina man di touch il suo compito principale è cambiare i timestamp dei file.
Ofc sta anche creando il file con il timestamp corrente e quindi è possibile modificare il file.
VI è un editor di testo che fa ciò che dice modifica testo aperto, salva, modifica file ecc.
Tutto è un tipo di utente e habbit: tocca quindi vi o vi file.txt con lo stesso colore diverso.
touch
ti permette di farlo inchmod +x
seguito, prima di modificarlo, il che avrebbe senso se stai scrivendo uno#!/bin/bash
script di shell.