Odpowiedzi:
touch
Najpierw sprawdzenie pliku potwierdza, że faktycznie możesz go utworzyć, zamiast marnować czas w edytorze, aby dowiedzieć się, że system plików jest tylko do odczytu lub jakiś inny problem.
:w
pierwszą rzecz po uruchomieniu vi
. (i :chmod +x %
jeśli chcesz, aby był wykonywalny)
touch
może się nie powieść tam vi
, gdzie :w!
by się to udało (na przykład jeśli file
istnieje, ale nie jesteś jego właścicielem i nie masz do niego dostępu do zapisu, podczas gdy masz dostęp do zapisu do bieżącego katalogu). Z drugiej strony, touch
może się uda, ale vi
jest :w
lub :w!
może się nie udać, jeśli jesteś właścicielem pliku, ale nie mają dostępu do zapisu do niego ani do bieżącego katalogu (byłbyś w stanie obejść z :!chmod +w %
(niektórych vi
implementacjach jak vim
można zrobić to automatycznie po :w!
)).
"foo" [readonly]
. I ponownie, kiedy Warning: Changing a readonly file.
Oprócz podanych odpowiedzi jedną z zalet dotyku jest to, że każdy inny użytkownik / terminal edytujący ten sam plik podczas jego dotykania otrzyma ostrzeżenie, gdy spróbuje zapisać zmiany.
WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?
Zaalarmuje ich to, mimo że nie dokonałeś żadnych zmian, a jedynie dotknąłeś pliku.
Oprócz zaakceptowanej odpowiedzi:
Warto zauważyć, że touch
służy do aktualizacji sygnatur czasowych plików. Jeśli użyjesz touch
pliku, który istnieje, zaktualizuje on sygnaturę czasową plików do bieżącej daty i godziny. Jeśli plik nie istnieje, tworzy pusty plik z bieżącą datą i godziną jako znacznikiem czasu.
vi
, z drugiej strony, nie tworzy nowego pliku, chyba że napiszesz do niego.
Na przykład, jeśli wpisałem vi test.txt
, napisałem kilka notatek, a następnie napisałem :q!
; test.txt
nie istniałby
Bez touch
tego nowy plik nie będzie istniał, dopóki nie poprosisz vi
o jego napisanie.
Rozważ system z wieloma użytkownikami (być może korzystasz z zamontowanego w sieci systemu plików współdzielonego przez wiele systemów, z których każdy ma wielu użytkowników). Uruchomienie touch
zapewni, że masz plik (i że możesz do niego pisać), a nawet zaktualizuje znacznik czasu. Inny użytkownik, który chce utworzyć taki plik, zobaczy, że jesteś jego właścicielem. Jeśli już istnieje, a inny użytkownik chce go usunąć lub zastąpić, zobaczy, że został niedawno zmodyfikowany i być może pomyśli dwa razy.
touch
Pierwsze nie ma korzyści ; vi
utworzy plik, jeśli nie istnieje.
Przyjęta odpowiedź mówi, że sprawdza, czy możesz tam pisać, zanim zmarnujesz czas w edytorze. To prawda, ale teraz za touch
każdym razem marnujesz czas na pisanie . Brak możliwości zapisu gdzieś jest dość wyjątkowy w porównaniu do tego, jak często będzie on po prostu działał (o ile pamiętasz sudo
dla plików spoza katalogu domowego lub /tmp
, lub jesteś zalogowany jako root).
Po prostu otwórz edytor i rób, co chcesz, a następnie spróbuj zapisać plik. Jeśli nie działa, nawet z :w!
, zapisz go w innym miejscu ( :w ~/asdf
) i napraw problem. Raz jest to stałe, można skopiować zawartość pliku z pliku tymczasowego do oryginału: cat ~/asdf > /mnt/example.txt && rm ~/asdf
. Powodem, dla którego używamy cat
zamiast mv
lub cp
jest użycie uprawnień miejsca docelowego i innych atrybutów.
Co więcej, dla niektórych bardziej zaawansowanego wykorzystania wiersza poleceń, można tła vi
z Ctrl+ Zpodczas rozwiązać problem (lub użycie :suspend
lub :sus
), aż w końcu fg
go ponownie, aby uruchomić polecenie zapisu.
Edycja: poprawiono post w odpowiedzi na komentarze / u / G-Man . Dzięki!
/mnt/example.txt
nie powinien być czytelny dla całego świata, ale twoja umask jest ustawiona na coś zezwalającego, np. 22, to /tmp/asdf
będzie dostępna dla wszystkich. Jeśli w systemie są inne osoby, mogą one być w stanie odczytać tymczasową kopię pliku. (2) Plik /mnt/example.txt
prawdopodobnie nie jest przeznaczony do zapisu w świecie, ale jeśli w systemie znajdują się złośliwe osoby, mogą one przeczytać tymczasową kopię pliku i zastąpić ją zmodyfikowaną wersją przed przeniesieniem / skopiowaniem z powrotem do właściwej lokalizacji. … (Ciąg dalszy)
/tmp
może temu zapobiec.) (3) Polecenie mv /tmp/asdf /mnt/example.txt
całkowicie zniszczy prąd /mnt/example.txt
i zastąpi go /tmp/asdf
. Chcesz zastąpić zawartość z /mnt/example.txt
z treścią z /tmp/asdf
. Korzystając z niego mv
, skonfigurujesz /mnt/example.txt
te same atrybuty co /tmp/asdf
- prawdopodobnie należące do ciebie i czytelne na całym świecie. Może być lepiej, cp /tmp/asdf /mnt/example.txt
a nawet cat /tmp/asdf > /mnt/example.txt
. … PS (4) Możesz zawiesić vi
, pisząc :suspend
(lub :sus
w skrócie).
/tmp
, ale nie ma usprawiedliwienia dla tego, że nie pisze do ~/
niego. Nie myślałem też, że to zastąpi atrybuty. Zmienię swój post, dzięki :)
vi
to wizualny edytor tekstu (vi = wizualny) W każdym razie jest wizualny w porównaniu do „ed”, co pozwala tylko zobaczyć i zmienić jeden wiersz tekstu na raz.
touch
Komenda aktualizuje datownik na istniejącym pliku lub utworzenie nowego pliku, jeśli plik nie istnieje. Jest dobry do testowania rzeczy, które są wysoce zależne od znaczników czasu.
Teraz, jeśli twój plik jest plikiem tekstowym lub jeszcze nie istnieje, otwarcie go za pomocą vi, a następnie wydanie polecenia :wq
vi, miałoby taki sam skutek jak dotknięcie tego pliku. To jedyny sposób, w jaki oba polecenia są w ogóle podobne.
W szczególności do użytku z vi
, nie ma potrzeby tworzenia pliku przed jego edycją: vi
można go użyć do utworzenia i zapisania nowego pliku. Istnieją jednak konteksty wywoływania, w których plik musi istnieć. Na przykład w moim systemie (OS X) mogę uruchomić odpowiedni edytor GUI (określony przez typ pliku) w następujący sposób:
open foo.txt
Otworzy się to foo.txt
w TextEdit, emacs lub cokolwiek, co określiłem jako mojego wybranego edytora plików tekstowych, i odłączę proces, aby natychmiast otrzymać monit. ( open bar.py
może otworzyć go w IDLE, edytorze Pythona itp.) Lub mogę jawnie zażądać emacs:
open -a emacs foo.txt
Ale open
wymaga, aby plik już istniał, w przeciwnym razie pojawi się błąd. Musiałem więc zdefiniować emacs
następującą funkcję powłoki, która pozwala mi pisać, emacs foo
aby uruchomić emacs
GUI, nawet jeśli foo
nie istnieje.
function emacs ()
{
if [ -n "$1" -a ! -e "$1" ]; then
/usr/bin/touch "$1";
fi;
open -a emacs "$@"
}
vi służy do edycji pliku jako użytkownik, natomiast touch może ustawić na nim znacznik czasu i jest najczęściej używany w skryptach i tym podobnych.
Innym sposobem utworzenia pliku jest:
>newfile.txt
zsh
jest identyczny cat >newfile.txt
i wymaga naciśnięcia klawiszy Ctrl + D.
Przez dotyk strony man jego głównym zadaniem jest zmiana znaczników czasu pliku.
Ofc tworzy również plik z bieżącym znacznikiem czasu, a następnie możesz edytować plik.
VI to edytor tekstu, który robi to, co mówi edytuj tekst otwieraj, zapisuj, edytuj plik itp.
Wszystko to smak użytkownika i nawyku: dotknij, a następnie plik vi lub vi. Txt ta sama rzecz inny kolor.
touch
pozwala to zrobićchmod +x
później, przed edycją, co miałoby sens, jeśli piszesz#!/bin/bash
skrypt powłoki.