Использование touch и vi?


55

Есть ли преимущество создания файла с сенсорным до редактирования .. как:

touch foo
vi foo

вместо того, чтобы сразу получить его в редакторе? Подобно:

vi foo

Я вижу довольно много уроков, использующих первый ( touchтогда vi).

Ответы:


111

touchсначала файл подтверждает, что у вас действительно есть возможность создать файл, вместо того, чтобы тратить время в редакторе только для того, чтобы узнать, что файловая система доступна только для чтения, или какая-то другая проблема.


6
И touchпозволяет делать это chmod +xпотом, перед редактированием, что будет иметь смысл, если вы пишете #!/bin/bashсценарий оболочки.
Аарон МакДейд

11
В качестве альтернативы, вы можете просто сделать :wпервое после запуска, viхотя. (и :chmod +x %если вы хотите сделать его исполняемым)
Стефан Шазелас

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

имеет много смысла сейчас!
Фавикс

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, тогда вы должны обновить этот ответ
Aswell

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снова запустить команду записи.

Редактировать: пост улучшен в ответ на комментарии / 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, но нет оправдания тому, что я не пишу ~/. Я также не думал о том, что это заменит атрибуты. Я отредактирую свой пост, спасибо :)
Люк

3

Там нет никакой выгоды. viсоздаст файл, если не существует.


1

vi визуальный текстовый редактор (vi = visual). В любом случае, он визуальный по сравнению с «ed», который позволяет вам видеть и изменять только одну строку текста за раз.

Команда touchобновляет метку времени в существующем файле или создает новый файл, если файл еще не существует. Это хорошо для тестирования вещей, которые сильно зависят от меток времени.

Теперь, если ваш файл представляет собой текстовый файл или еще не существует, открытие его с помощью vi, а затем выполнение команды :wqдля vi будет иметь тот же результат, что и касание этого файла. Только так две команды похожи.


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для запуска emacsGUI, даже если fooон не существует.

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

0

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

Другой способ создать файл:

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