Використання дотику та vi?


55

Чи є користь створити файл із дотиком перед редагуванням .. як:

touch foo
vi foo

порівняно з отриманням цього редактора відразу? Подібно до:

vi foo

Я бачу досить багато навчальних посібників з використанням колишнього ( touchтоді vi).

Відповіді:


111

touchПерший файл підтверджує, що у вас є можливість створити файл, а не витрачати час на редактор, щоб дізнатися, що файлова система лише для читання або якась інша проблема.


6
І touchдозволяє робити це chmod +xпісля цього, перед редагуванням, що мало б сенс, якщо ви пишете #!/bin/bashсценарій оболонки.
Аарон Макдейд

11
Крім того, ви можете просто зробити :wперше, після чого почати vi. (і :chmod +x %якщо ви хочете зробити його виконуваним)
Stéphane Chazelas

26
touchможе провалитися там, де viвін :w!би досяг успіху (наприклад, якщо він fileіснує, але ви не є його власником і не маєте доступу до нього, тоді як у вас є доступ для запису до поточного каталогу). З іншого боку , touchможе бути успішним , але vi«s :wабо :w!може зазнати невдачі , якщо ви власник файлу, але не має доступу на запис до нього , ні до поточної директорії (ви були б в змозі працювати навколо нього з :!chmod +w %(деякими viреалізаціями , як vimможна зробити що автоматично після :w!)).
Стефан Шазелас

має багато сенсу зараз!
Fawix

4
Vim / Vi дуже чітко , якщо ви відкриєте файл , який не має дозволу на запис: "foo" [readonly]. І знову при вході в режим вставки:Warning: Changing a readonly file.
DevSolar

25

Окрім наведених відповідей, однією перевагою дотику є те, що будь-який інший користувач / термінал, що редагує той самий файл, поки ви торкнулися його, отримає попередження, коли намагається зберегти будь-які зміни.

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

Це попередить їх, навіть якщо ви самі не зробили жодних змін і лише торкнулися файлу.


хороший момент, тож це, по суті, хороший спосіб виявити, чи користуються люди / редагують один і той же файл, і попередити їх одночасно. Я бачу очевидну вигоду від цього в середовищі, де живуть багато орендарів!
Fawix

@Fawix, тоді слід оновити цю відповідь Асвелл
Kiwy

19

Крім прийнятої відповіді:

Варто зазначити, що touchвикористовується для оновлення часових міток файлів. Якщо ви використовуєте touchфайл, який існує, він оновлює часові позначки файлів до поточної дати та часу. Якщо файл не існує, він створює порожній файл із поточною датою та часом як часова мітка.

viз іншого боку, не створює новий файл, якщо ви не пишете в нього.

Наприклад, якщо я набрав vi test.txt, набрав кілька приміток, то набрав :q!; test.txtне існувало б.


Як щодо користі, описаної у прийнятій відповіді?
JBentley

8

Без touchцього новий файл не буде існувати, поки ви не скажете viйого написати.

Розгляньте багатокористувацьку систему (можливо, ви користуєтеся мережевою файловою системою, спільною для багатьох систем, кожна з якою має багато користувачів). Запуск touchгарантує, що у вас є файл (і що ви можете в нього записати) і навіть оновити часову позначку. Інший користувач, який хоче створити такий файл, побачить, що ви ним володієте. Якщо він уже існує, а інший користувач хоче його видалити або замінити, він побачить, що він нещодавно був змінений і, можливо, подумає двічі.


4

touchПершої користі немає ; viстворить файл, якщо його не існує.

У прийнятій відповіді сказано, що вона перевіряє, чи можна писати там, перш ніж витрачати час в редакторі. Щоправда, але тепер ви будете витрачати час, друкуючи touchкожен раз. Неможливість кудись записати є досить винятковою порівняно з тим, як часто це буде просто працювати (доки ви пам’ятаєте sudoпро файли за межами домашнього каталогу або /tmpввійшли як root).

Просто відкрийте редактор і виконайте все, що завгодно, а потім спробуйте зберегти файл. Якщо це навіть не працює, :w!збережіть його в іншому місці ( :w ~/asdf) та виправте проблему. Після того, як вона вирішена, ви можете скопіювати вміст файлу з тимчасового файлу в оригіналі: cat ~/asdf > /mnt/example.txt && rm ~/asdf. Причина, яку ми використовуємо catзамість mvабо в cpтому, щоб використовувати дозволи та інші атрибути призначення.

Крім того, для деякого більш розширеного використання командного рядка ви можете зіткнутися viз Ctrl+ Zпід час виправлення проблеми (або використання :suspend, або :sus), і, нарешті, fgзнову запустити команду write.

Редагувати: публікація покращена у відповідь на коментарі / u / G-Man . Дякую!


3
Тут є деякі проблеми із безпекою: (1) Якщо файл /mnt/example.txtне може бути читаним у всьому світі, але ваш umask встановлений на щось дозвільне, як 22, то воно /tmp/asdf буде читабельним у всьому світі. Якщо в системі є інші люди, вони можуть прочитати тимчасову копію файлу. (2) Файл /mnt/example.txt, ймовірно, не може бути зареєстрованим у всьому світі, але, якщо в системі є зловмисники, вони можуть прочитати тимчасову копію файлу та замінити його модифікованою версією перед тим, як перемістити / скопіювати повернути його в потрібне місце.   … (Продовження)
G-Man

3
(Продовження)… (Увімкнення клейкого біта /tmpможе запобігти цьому.) (3) Команда mv /tmp/asdf /mnt/example.txtповністю знищить струм /mnt/example.txtі замінить його /tmp/asdf. Ви хочете замінити вміст в /mnt/example.txtс вмістом в /tmp/asdf. Використовуючи mv, ви налаштовуєте /mnt/example.txtтакі самі атрибути , що /tmp/asdfймовірно - належать вам та читають у всьому світі. Це може бути краще cp /tmp/asdf /mnt/example.txtабо навіть cat /tmp/asdf > /mnt/example.txt. … PS (4) Ви можете призупинити vi, ввівши :suspend(або :susкоротко).
G-Man

@ G-Man Це кілька хороших моментів. Мені не особливо страшно, коли хтось краде файл протягом 5 хвилин /tmp, але він не має приводу для того, щоб не писати ~/натомість. Я також не думав, що це замінить атрибути. Я відредагую свій пост, дякую :)
Люк


1

vi є візуальним текстовим редактором (vi = візуально) Це візуально порівняно з "редактором" у будь-якому випадку, що дозволяє лише переглядати та змінювати один рядок тексту за один раз.

touchКоманда оновлює мітку часу на існуючий файл або створює новий файл , якщо файл не існує. Це добре для тестування речей, які сильно залежать від часових позначок.

Тепер, якщо ваш файл є текстовим файлом, або його ще не існує, відкриття його з vi, видача команди :wqvi, матиме такий же результат, як і торкання цього файлу. Це єдиний спосіб, коли дві команди взагалі схожі.


1

Спеціально для використання vi, перед редагуванням не потрібно створювати файл: viйого можна використовувати для створення та збереження нового файлу. Однак існують контексти виклику, де файл повинен існувати. Наприклад, у моїй системі (OS X) я можу запустити відповідний редактор графічного інтерфейсу (визначається типом файлу) на зразок цього:

open foo.txt

Це відкриється foo.txtв TextEdit, або в emacs, або в тому, що я вказав як мій редактор вибору текстових файлів, і від'єднає процес, щоб я негайно повернув своє запит. ( open bar.pyможе відкрити його в IDLE, редакторі python; тощо) Або я можу явно запитати emacs:

open -a emacs foo.txt

Але openвимагає, щоб файл вже існував, інакше він викликає помилку. Тому мені довелося визначити emacsнаступну функцію оболонки, яка дозволяє мені записати, emacs fooщоб запустити emacsграфічний інтерфейс, навіть якщо fooйого не існує.

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

0

vi використовується для редагування файлу як користувача, тоді як дотик може встановити на ньому часову позначку і в основному використовується в сценаріях тощо.

Ще один спосіб створити файл:

>newfile.txt

1
Це ненадійно, оскільки це не вказано (afaik) у специфікації POSIX. Наприклад, In zsh, він ідентичний, cat >newfile.txtі вам потрібно натиснути Ctrl + D.
Адам Кац

@AdamKatz хороший пункт; Я оновив відповідь, дякую за пораду.
Джеймс Янгмен

0

Дотикова сторінка людини його головне завдання - змінити часові позначки файлів.
Ofc також створює файл із поточною міткою часу, а потім ви можете редагувати файл.

VI - це текстовий редактор, який виконує редагування тексту: відкрийте, збережіть, редагуйте файл і т. Д.

Все - це смак користувача та хабіта: торкніться тоді vi або vi file.txt те саме, іншого кольору.


0

touch команда змінює дату і час файлу з поточною міткою часу.
якщо файл не існує, він створює новий файл із датою та часом.

vi редактор використовується для редагування файлів, якщо файл не існує, він створює новий файл, якщо тільки ми не збережемо файл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.