Réponses:
touch
Le 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.
:w
première chose après le début vi
si. (et :chmod +x %
si vous voulez le rendre exécutable)
touch
peut échouer là où vi
est :w!
aurait réussi si (par exemple si file
existe 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, touch
peut réussir , mais vi
l » :w
ou :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 vi
implémentations comme vim
peut le faire que automatiquement sur :w!
)).
"foo" [readonly]
. Et encore en entrant en mode insertion:Warning: Changing a readonly file.
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.
En dehors de la réponse acceptée:
Il est à noter qu’il touch
est utilisé pour mettre à jour les horodatages des fichiers. Si vous utilisez touch
un 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.
vi
d'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.txt
n'existerait pas.
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 touch
vous 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.
Il n'y a aucun avantage à se touch
lancer d'abord; vi
cré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 à touch
chaque 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 sudo
de fichiers en dehors de votre répertoire de base /tmp
ou 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 cat
au lieu de mv
ou cp
est 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 vi
avec Ctrl+ Zpendant que vous résolvez le problème (ou utiliser :suspend
, ou :sus
), et enfin fg
exécuter à nouveau la commande write.
Edit: post amélioré en réponse aux commentaires de / u / G-Man . Merci!
/mnt/example.txt
n'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.txt
n'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)
/tmp
pourrait empêcher cela.) (3) La commande mv /tmp/asdf /mnt/example.txt
détruira totalement le courant /mnt/example.txt
et le remplacera /tmp/asdf
. Vous souhaitez remplacer le contenu de /mnt/example.txt
par 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/asdf
vous possédez probablement et lisibles par tout le monde. Ce pourrait être mieux cp /tmp/asdf /mnt/example.txt
ou même cat /tmp/asdf > /mnt/example.txt
. … PS (4) Vous pouvez suspendre vi
en tapant :suspend
(ou :sus
, pour faire court).
/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 :)
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 touch
commande 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.
Spécifiquement pour une utilisation avec vi
, il n’est pas nécessaire de créer le fichier avant de le modifier: vi
peut ê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.txt
dans 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.py
pourrait l'ouvrir dans IDLE, l'éditeur de python; etc.) Ou je peux demander explicitement à emacs:
open -a emacs foo.txt
Mais open
nécessite que le fichier existe déjà, sinon cela déclenche une erreur. Donc, je devais définir emacs
pour être la fonction shell suivante, ce qui me permet d’écrire emacs foo
pour lancer l’ emacs
interface graphique même s’il foo
n’existe pas.
function emacs ()
{
if [ -n "$1" -a ! -e "$1" ]; then
/usr/bin/touch "$1";
fi;
open -a emacs "$@"
}
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
zsh
est identique à cat >newfile.txt
et nécessite que vous appuyiez sur Ctrl + D.
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.
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.
touch
vous permet de le fairechmod +x
ensuite, avant la modification, ce qui serait logique si vous écrivez un#!/bin/bash
script shell.