Utilisation du toucher et vi?

55

Y a-t-il un avantage à créer un fichier avec touch avant de le modifier .. comme:

touch foo
vi foo

par rapport à un éditeur tout de suite? Comme:

vi foo

Je vois pas mal de tutoriels utilisant l'ancien ( touchalors vi).

Fawix
la source

Réponses:

111

touchLe fichier d’abord confirme que vous avez la possibilité de créer le fichier plutôt que de perdre du temps dans un éditeur uniquement pour découvrir que le système de fichiers est en lecture seule ou un autre problème.

DopeGhoti
la source
6
Et touchvous permet de le faire chmod +xensuite, avant la modification, ce qui serait logique si vous écrivez un #!/bin/bashscript shell.
Aaron McDaid
11
Alternativement, vous pouvez simplement faire la :wpremière chose après le début visi. (et :chmod +x %si vous voulez le rendre exécutable)
Stéphane Chazelas
26
touchpeut échouer là où viest :w!aurait réussi si (par exemple si fileexiste mais vous n'êtes pas son propriétaire et ne pas avoir accès en écriture à elle, alors que vous avez accès en écriture dans le répertoire courant). A l' inverse, touchpeut réussir , mais vil » :wou :w!peut échouer si vous êtes propriétaire du fichier, mais n'ont pas accès en écriture à elle , ni dans le répertoire courant (vous seriez en mesure de travailler autour d' elle avec :!chmod +w %(certaines viimplémentations comme vimpeut le faire que automatiquement sur :w!)).
Stéphane Chazelas
fait beaucoup de sens maintenant!
Fawix
4
Vim / vi très clairement si vous ouvrez un fichier que vous n'êtes pas autorisé à écrire à: "foo" [readonly]. Et encore en entrant en mode insertion:Warning: Changing a readonly file.
DevSolar le
25

Outre les réponses données, l'un des avantages de la fonction tactile est que tout autre utilisateur / terminal modifiant le même fichier pendant que vous le touchiez reçoit un avertissement lorsqu'il tente de sauvegarder les modifications.

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

Cela les alerterait même si vous n'avez apporté aucune modification et que vous avez uniquement touché le fichier.

amisax
la source
bon point, c’est donc un bon moyen de savoir si les personnes utilisent / modifient le même fichier et de les avertir en même temps. Je vois un avantage évident à cela dans un environnement multi-locataire!
Fawix le
@Fawix alors vous devriez mettre à jour cette réponse Aswell
Kiwy
19

En dehors de la réponse acceptée:

Il est à noter qu’il touchest utilisé pour mettre à jour les horodatages des fichiers. Si vous utilisez touchun fichier existant, l’horodatage des fichiers sera mis à jour à la date et à l’heure actuelles. Si le fichier n'existe pas, il crée un fichier vide avec la date et l'heure actuelles comme horodatage.

vid'autre part, ne crée pas un nouveau fichier à moins que vous n'y écriviez.

Par exemple, si j'ai tapé vi test.txt, tapé quelques notes, puis tapé :q!; test.txtn'existerait pas.

Peschke
la source
Qu'en est-il de l'avantage décrit dans la réponse acceptée?
JBentley
8

Sans cela touch, un nouveau fichier n’existera pas tant que vous n’avez pas demandé vià l’écrire.

Considérons un système multi-utilisateur (vous êtes peut-être sur un système de fichiers monté en réseau partagé par de nombreux systèmes, chacun avec de nombreux utilisateurs). Courir touchvous assurera que vous avez le fichier (et que vous pouvez y écrire) et met même à jour l’horodatage. Un autre utilisateur souhaitant créer un tel fichier verra que vous en êtes le propriétaire. S'il existe déjà et qu'un autre utilisateur souhaite le supprimer ou le remplacer, il verra qu'il a été modifié récemment et réfléchira peut-être à deux fois.

Adam Katz
la source
4

Il n'y a aucun avantage à se touchlancer d'abord; vicréera le fichier s'il n'existe pas.

La réponse acceptée dit qu'elle vérifie si vous pouvez écrire ici avant de perdre du temps dans un éditeur. C'est vrai, mais maintenant vous perdrez du temps à taper à touchchaque fois. Ne pas être capable d'écrire quelque part est assez exceptionnel par rapport à la fréquence à laquelle cela fonctionnera (tant que vous vous souvenez sudode fichiers en dehors de votre répertoire de base /tmpou que vous êtes connecté en tant que root).

Ouvrez simplement l'éditeur et faites ce que vous voulez, puis essayez de sauvegarder le fichier. Si cela ne fonctionne pas, même avec :w!, sauvegardez-le ailleurs ( :w ~/asdf) et corrigez le problème. Une fois qu'il est fixé, vous pouvez copier le contenu du fichier à partir du fichier temporaire à l'original: cat ~/asdf > /mnt/example.txt && rm ~/asdf. La raison pour laquelle nous utilisons catau lieu de mvou cpest d'utiliser les autorisations de la destination et d'autres attributs.

De plus, pour une utilisation plus avancée de la ligne de commande, vous pouvez utiliser l'arrière-plan viavec Ctrl+ Zpendant que vous résolvez le problème (ou utiliser :suspend, ou :sus), et enfin fgexécuter à nouveau la commande write.

Edit: post amélioré en réponse aux commentaires de / u / G-Man . Merci!

Luc
la source
3
Il y a quelques problèmes de sécurité ici: (1) Si le fichier /mnt/example.txtn'est pas censé être lisible par tout le monde, mais que votre umask est réglé sur quelque chose de permissif comme 22, alors /tmp/asdf il sera lisible par tout le monde. S'il y a d'autres personnes sur le système, elles peuvent peut-être lire la copie temporaire du fichier. (2) Le fichier /mnt/example.txtn'est probablement pas supposé être accessible en écriture, mais s'il y a des personnes mal intentionnées sur le système, elles peuvent peut-être lire la copie temporaire du fichier et la remplacer par une version modifiée avant de la déplacer / la copier. il retourne au bon endroit.   … (Suite)
G-Man dit 'Réintégrez Monica' le
3
(Suite)… (Activer le blocage du blocage /tmppourrait empêcher cela.) (3) La commande mv /tmp/asdf /mnt/example.txtdétruira totalement le courant /mnt/example.txtet le remplacera /tmp/asdf. Vous souhaitez remplacer le contenu de /mnt/example.txtpar le contenu de /tmp/asdf. En utilisant mv, vous configurez de manière /mnt/example.txtà avoir les mêmes attributs que ceux que /tmp/asdfvous possédez probablement et lisibles par tout le monde. Ce pourrait être mieux cp /tmp/asdf /mnt/example.txtou même cat /tmp/asdf > /mnt/example.txt. … PS (4) Vous pouvez suspendre vien tapant :suspend(ou :sus, pour faire court).
G-Man dit 'Réintégrer Monica' le
@ G-Man Voilà quelques bons points. Je n'ai pas particulièrement peur que quelqu'un vole un fichier pendant les 5 minutes qu'il a parcourues /tmp, mais il n'y a aucune excuse pour ne pas écrire à la ~/place. Je n'avais pas non plus pensé que cela remplacerait les attributs. Je vais éditer mon post, merci :)
Luc
3

Il n'y a aucun avantage. vicréera un fichier s'il n'existe pas.

ronakg
la source
1

vi est un éditeur de texte visuel (vi = visuel) Il est visuel par rapport à "ed" de toute façon, ce qui vous permet de voir et de modifier une ligne de texte à la fois.

La touchcommande met à jour l'horodatage sur un fichier existant ou crée un nouveau fichier si le fichier n'existait pas déjà. C'est bon pour tester des choses qui dépendent fortement de l'horodatage.

Maintenant, si votre fichier est un fichier texte, ou n’existe pas encore, l’ouvrir avec vi, puis l’envoi de la commande :wqà vi aurait le même résultat que de toucher ce fichier. C'est la seule façon dont les deux commandes sont similaires.

Malyy
la source
1

Spécifiquement pour une utilisation avec vi, il n’est pas nécessaire de créer le fichier avant de le modifier: vipeut être utilisé pour créer et enregistrer un nouveau fichier. Cependant, il existe des contextes d'appel dans lesquels le fichier doit exister. Par exemple, sur mon système (OS X), je peux lancer un éditeur d’interface graphique approprié (déterminé par le type de fichier), comme ceci:

open foo.txt

Cela s'ouvrirait foo.txtdans TextEdit, ou dans emacs, ou tout ce que j'aurais spécifié comme éditeur de choix pour les fichiers texte, et détacherait le processus afin que je récupère mon invite immédiatement. ( open bar.pypourrait l'ouvrir dans IDLE, l'éditeur de python; etc.) Ou je peux demander explicitement à emacs:

open -a emacs foo.txt

Mais opennécessite que le fichier existe déjà, sinon cela déclenche une erreur. Donc, je devais définir emacspour être la fonction shell suivante, ce qui me permet d’écrire emacs foopour lancer l’ emacsinterface graphique même s’il foon’existe pas.

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

vi est utilisé pour éditer un fichier en tant qu'utilisateur, alors que touch peut définir l'horodatage et est principalement utilisé dans les scripts et autres.

Une autre façon de créer un fichier est:

>newfile.txt
licklake
la source
1
Ceci n'est pas fiable car ce n'est pas (dans la mesure du possible) spécifié dans la spécification POSIX. Par exemple, In zshest identique à cat >newfile.txtet nécessite que vous appuyiez sur Ctrl + D.
Adam Katz
@AdamKatz bon point; J'ai mis à jour la réponse, merci pour le conseil.
James Youngman
0

Par page de contact, son travail principal consiste à modifier les horodatages des fichiers.
Ofc est également en train de créer le fichier avec l’horodatage actuel et vous pourrez ensuite éditer le fichier.

VI est éditeur de texte qui fait ce qu'il dit ouvert modifier texte, enregistrer, éditer le fichier , etc.

Tout est la saveur de l' utilisateur et d'Habitude: vi ou alors toucher vi file.txt même couleur différente.

Igiannak
la source
0

touch La commande change la date et l'heure d'un fichier avec l'horodatage actuel.
si le fichier n'existe pas, il crée un nouveau fichier avec la date et l'heure.

vi editor est utilisé pour éditer des fichiers si le fichier n'existe pas, il crée un nouveau fichier sauf si nous n'enregistrons pas le fichier.

Premraj
la source