Uso del tocco e vi?


55

C'è un vantaggio nella creazione di un file con tocco prima della modifica .. come:

touch foo
vi foo

contro ottenerlo immediatamente per l'editor? Piace:

vi foo

Vedo alcuni tutorial che usano il primo ( touchallora vi).

Risposte:


111

touching 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.


6
E touchti permette di farlo in chmod +xseguito, prima di modificarlo, il che avrebbe senso se stai scrivendo uno #!/bin/bashscript di shell.
Aaron McDaid,

11
In alternativa, puoi solo fare la :wprima cosa dopo aver iniziato viperò. (e :chmod +x %se vuoi renderlo eseguibile)
Stéphane Chazelas,

26
touchpotrebbe non riuscire dove vi's :w!sarebbero riusciti anche se (per esempio se fileesiste 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, touchpotrebbe riuscire ma vi's :wo :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 viimplementazioni come vimpuò fare che automaticamente su :w!)).
Stéphane Chazelas,

ha molto senso ora!
Fawix,

4
Vim / VI molto chiaramente lo stato se si apre un file che non hai il permesso di scrivere a: "foo" [readonly]. E di nuovo quando si accede alla modalità di inserimento:Warning: Changing a readonly file.
DevSolar

25

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.


buon punto, quindi è essenzialmente un buon modo per scoprire se le persone stanno usando / modificando lo stesso file e avvisandoli allo stesso tempo. Vedo un chiaro vantaggio di ciò in un ambiente multi-tenant!
Fawix,

@Fawix allora dovresti aggiornare questa risposta Aswell
Kiwy

19

A parte la risposta accettata:

Vale la pena notare che touchviene utilizzato per aggiornare i timestamp dei file. Se lo usi touchsu 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.

vid'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.txtnon esisterebbe.


Che dire del vantaggio descritto nella risposta accettata?
JBentley,

8

Senza touch, un nuovo file non esisterà fino a quando non dici vidi scriverlo.

Considera un sistema multiutente (forse sei su un filesystem montato in rete condiviso da molti sistemi ciascuno con molti utenti). L'esecuzione touchassicurerà 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.


4

Non vi è alcun vantaggio touchnell'ing prima; vicreerà 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 touchogni volta. Non essere in grado di scrivere da qualche parte è abbastanza eccezionale rispetto a quanto spesso funzionerà (purché ti ricordi sudodi 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 catanziché mvo cpè utilizzare le autorizzazioni della destinazione e altri attributi.

Inoltre, per un uso più avanzato della riga di comando, è possibile eseguire lo sfondo vicon Ctrl+ Zmentre si risolve il problema (o utilizzare :suspend, o :sus) e infine fgeseguirlo nuovamente per eseguire il comando di scrittura.

Modifica: post migliorato in risposta ai commenti di / u / G-Man . Grazie!


3
Ci sono alcuni problemi di sicurezza qui: (1) Se il file /mnt/example.txtnon 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.txtProbabilmente 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)
G-Man dice "Ripristina Monica" il

3
(Proseguendo) ... (L'impostazione del bit appiccicoso /tmppotrebbe impedirlo.) (3) Il comando mv /tmp/asdf /mnt/example.txtdistruggerà totalmente la corrente /mnt/example.txte la sostituirà con /tmp/asdf. Si desidera sostituire il contenuto di /mnt/example.txtcon il contenuto di /tmp/asdf. Usando mv, hai impostato /mnt/example.txtgli stessi attributi di /tmp/asdf- probabilmente di tua proprietà e leggibili in tutto il mondo. Potrebbe essere meglio cp /tmp/asdf /mnt/example.txto addirittura cat /tmp/asdf > /mnt/example.txt. ... PS (4) È possibile sospendere vidigitando :suspend(o :sus, in breve).
G-Man dice "Reinstate Monica" il

@ G-Man Questi sono alcuni punti positivi. Non ho particolarmente paura di qualcuno che rubi un file durante i 5 minuti in cui si trova /tmp, ma non ci sono scuse per non scrivere ~/invece. Inoltre non avevo pensato che avrebbe sostituito gli attributi. Modificherò il mio post, grazie :)
Luc

3

Non ci sono benefici. vicreerà un file se non esiste.


1

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 touchcomando 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 :wqsu vi, si otterrebbe lo stesso risultato del tocco di quel file. Questo è l'unico modo in cui i due comandi sono simili.


1

Specificamente per l'uso con vi, non è necessario creare il file prima di modificarlo: vipuò 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.txtin 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.pypotrebbe aprirlo in IDLE, nell'editor python; ecc.) Oppure posso richiedere esplicitamente emacs:

open -a emacs foo.txt

Ma openrichiede che il file esista già, altrimenti genera un errore. Quindi ho dovuto definire emacsla seguente funzione shell, che mi consente di scrivere emacs fooper avviare la emacsGUI anche se foonon esiste.

function emacs () 
{ 
    if [ -n "$1" -a ! -e "$1" ]; then
        /usr/bin/touch "$1";
    fi;
    open -a emacs "$@"
}

0

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

1
Questo non è affidabile perché non è (afaik) specificato nelle specifiche POSIX. Ad esempio, In zsh, è identico cat >newfile.txte deve essere premuto Ctrl + D.
Adam Katz,

@AdamKatz buon punto; Ho aggiornato la risposta, grazie per il consiglio.
James Youngman,

0

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.


0

touch Il comando modifica la data e l'ora di un file con il timestamp corrente.
se il file non esiste, crea un nuovo file con data e ora.

vi l'editor viene utilizzato per modificare i file se il file non esiste, crea un nuovo file a meno che non salviamo il file.

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.