Ответы:
touchсначала файл подтверждает, что у вас действительно есть возможность создать файл, вместо того, чтобы тратить время в редакторе только для того, чтобы узнать, что файловая система доступна только для чтения, или какая-то другая проблема.
:wпервое после запуска, viхотя. (и :chmod +x %если вы хотите сделать его исполняемым)
touchможет потерпеть неудачу , когда vi«s :w!удалось бы хотя (например , если fileсуществует , но вы не являетесь его владельцем и не имеют доступа на запись к нему, в то время как у вас есть доступ к текущему каталогу). С другой стороны , touchможет быть успешным , но vi«s :wили , :w!если вы владелец файла может потерпеть неудачу, но не имеют доступа на запись к нему , ни к текущей директории (вы были бы в состоянии работать вокруг него с :!chmod +w %(некоторые viреализации , как vimможно сделать что автоматически по факту :w!)).
"foo" [readonly]. И снова при входе в режим вставки:Warning: Changing a readonly file.
Помимо данных ответов, одно из преимуществ касания состоит в том, что любой другой пользователь / терминал, редактирующий тот же файл, пока вы его касались, получит предупреждение, когда попытается сохранить любые изменения.
WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?
Это предупредит их, даже если вы не внесли никаких изменений сами по себе и только коснулись файла.
Помимо принятого ответа:
Стоит отметить, что touchиспользуется для обновления файловых меток времени. Если вы используете touchсуществующий файл, он обновит временную метку файлов до текущей даты и времени. Если файл не существует, он создает пустой файл с текущей датой и временем в качестве метки времени.
viс другой стороны, не создает новый файл, если вы не пишете в него.
Например, если я напечатал vi test.txt, набрал несколько заметок, а затем набрал :q!; test.txtне будет существовать
Без touchэтого новый файл не будет существовать, пока вы не попросите viего написать.
Рассмотрим многопользовательскую систему (возможно, вы подключены к сетевой файловой системе, которую используют многие системы, в каждой из которых много пользователей). Запуск touchобеспечит вам файл (и что вы можете написать к ней) и даже обновляет метку времени. Другой пользователь, желающий создать такой файл, увидит, что он принадлежит вам. Если он уже существует и другой пользователь захочет удалить или заменить его, он увидит, что он был недавно изменен, и, возможно, подумает дважды.
В 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 . Спасибо!
/mnt/example.txtне должен быть доступен для чтения всему миру, но ваш umask настроен на что-то разрешающее, например 22, тогда /tmp/asdf он будет доступен для чтения всем. Если в системе есть другие люди, они могут прочитать временную копию файла. (2) /mnt/example.txtВероятно, файл не предназначен для всеобщей записи, но, если в системе есть злоумышленники, они могут прочитать временную копию файла и заменить ее модифицированной версией перед перемещением / копированием. это обратно в нужное место. … (Продолжение)
/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, для краткости).
/tmp, но нет оправдания тому, что я не пишу ~/. Я также не думал о том, что это заменит атрибуты. Я отредактирую свой пост, спасибо :)
vi визуальный текстовый редактор (vi = visual). В любом случае, он визуальный по сравнению с «ed», который позволяет вам видеть и изменять только одну строку текста за раз.
Команда touchобновляет метку времени в существующем файле или создает новый файл, если файл еще не существует. Это хорошо для тестирования вещей, которые сильно зависят от меток времени.
Теперь, если ваш файл представляет собой текстовый файл или еще не существует, открытие его с помощью vi, а затем выполнение команды :wqдля vi будет иметь тот же результат, что и касание этого файла. Только так две команды похожи.
Специально для использования с 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 "$@"
}
vi используется для редактирования файла как пользователь, в то время как touch может установить для него временную метку и в основном используется в сценариях и т.п.
Другой способ создать файл:
>newfile.txt
zsh, он идентичен cat >newfile.txtи требует, чтобы вы нажали Ctrl + D.
С помощью сенсорной страницы его основная задача - изменить временные метки файлов.
Ofc также создает файл с текущей меткой времени, а затем вы можете редактировать файл.
VI - это текстовый редактор, который делает то, что говорит: редактировать текст, открывать, сохранять, редактировать файл и т. Д.
Все это как вкус пользователя и привычки: коснитесь, затем vi или vi file.txt, то же самое, другого цвета.
touchпозволяет делать этоchmod +xпотом, перед редактированием, что будет иметь смысл, если вы пишете#!/bin/bashсценарий оболочки.