Użycie dotyku i vi?

55

Czy istnieje korzyść z utworzenia pliku dotykowego przed edycją ... np .:

touch foo
vi foo

w porównaniu z natychmiastowym przekazaniem go do edytora? Lubić:

vi foo

Widzę sporo tutoriali wykorzystujących poprzednie ( touchwtedy vi).

Fawix
źródło

Odpowiedzi:

111

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

DopeGhoti
źródło
6
I touchpozwala to zrobić chmod +xpóźniej, przed edycją, co miałoby sens, jeśli piszesz #!/bin/bashskrypt powłoki.
Aaron McDaid
11
Alternatywnie możesz po prostu zrobić :wpierwszą rzecz po uruchomieniu vi. (i :chmod +x %jeśli chcesz, aby był wykonywalny)
Stéphane Chazelas
26
touchmoże się nie powieść tam vi, gdzie :w!by się to udało (na przykład jeśli fileistnieje, 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, touchmoże się uda, ale vijest :wlub :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 viimplementacjach jak vimmożna zrobić to automatycznie po :w!)).
Stéphane Chazelas
ma teraz sens!
Fawix,
4
Vim / VI bardzo jasno stwierdzić, jeśli użytkownik otworzy plik, który nie ma uprawnień do zapisu: "foo" [readonly]. I ponownie, kiedy Warning: Changing a readonly file.
wchodzę w
25

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.

amisax
źródło
dobra uwaga, więc jest to zasadniczo dobry sposób, aby dowiedzieć się, czy ludzie używają / edytują ten sam plik i ostrzegają go w tym samym czasie. Widzę wyraźną korzyść z tego w środowisku wielu najemców!
Fawix,
@Fawix, powinieneś zaktualizować tę odpowiedź
Aswell
19

Oprócz zaakceptowanej odpowiedzi:

Warto zauważyć, że touchsłuży do aktualizacji sygnatur czasowych plików. Jeśli użyjesz touchpliku, 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.txtnie istniałby

Peschke
źródło
Co z korzyścią opisaną w zaakceptowanej odpowiedzi?
JBentley,
8

Bez touchtego nowy plik nie będzie istniał, dopóki nie poprosisz vio 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 touchzapewni, ż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.

Adam Katz
źródło
4

touchPierwsze nie ma korzyści ; viutworzy 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 touchkaż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 sudodla 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 catzamiast mvlub cpjest użycie uprawnień miejsca docelowego i innych atrybutów.

Co więcej, dla niektórych bardziej zaawansowanego wykorzystania wiersza poleceń, można tła viz Ctrl+ Zpodczas rozwiązać problem (lub użycie :suspendlub :sus), aż w końcu fggo ponownie, aby uruchomić polecenie zapisu.

Edycja: poprawiono post w odpowiedzi na komentarze / u / G-Man . Dzięki!

Luc
źródło
3
Występują tutaj pewne problemy związane z bezpieczeństwem: (1) Jeśli plik /mnt/example.txtnie 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.txtprawdopodobnie 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)
G-Man
3
(Ciąg dalszy)… (Włączenie lepkiego bitu /tmpmoże temu zapobiec.) (3) Polecenie mv /tmp/asdf /mnt/example.txtcałkowicie zniszczy prąd /mnt/example.txti zastąpi go /tmp/asdf. Chcesz zastąpić zawartość z /mnt/example.txtz treścią z /tmp/asdf. Korzystając z niego mv, skonfigurujesz /mnt/example.txtte 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.txta nawet cat /tmp/asdf > /mnt/example.txt. … PS (4) Możesz zawiesić vi, pisząc :suspend(lub :susw skrócie).
G-Man,
@ G-Man Oto kilka dobrych punktów. Nie boję się szczególnie, że ktoś kradnie plik w ciągu 5 minut, w którym się on znajduje /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 :)
Luc
3

Nie ma korzyści. viutworzy plik, jeśli nie istnieje.

ronakg
źródło
1

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.

touchKomenda 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 :wqvi, miałoby taki sam skutek jak dotknięcie tego pliku. To jedyny sposób, w jaki oba polecenia są w ogóle podobne.

malyy
źródło
1

W szczególności do użytku z vi, nie ma potrzeby tworzenia pliku przed jego edycją: vimoż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.txtw 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.pymoże otworzyć go w IDLE, edytorze Pythona itp.) Lub mogę jawnie zażądać emacs:

open -a emacs foo.txt

Ale openwymaga, aby plik już istniał, w przeciwnym razie pojawi się błąd. Musiałem więc zdefiniować emacsnastępującą funkcję powłoki, która pozwala mi pisać, emacs fooaby uruchomić emacsGUI, nawet jeśli foonie istnieje.

function emacs () 
{ 
    if [ -n "$1" -a ! -e "$1" ]; then
        /usr/bin/touch "$1";
    fi;
    open -a emacs "$@"
}
Alexis
źródło
0

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
lizawka
źródło
1
Jest to niewiarygodne, ponieważ nie jest określone (afaik) w specyfikacji POSIX. Na przykład In zshjest identyczny cat >newfile.txti wymaga naciśnięcia klawiszy Ctrl + D.
Adam Katz
@AdamKatz dobry punkt; Zaktualizowałem odpowiedź, dziękuję za radę.
James Youngman,
0

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.

igiannak
źródło
0

touch polecenie zmienia datę i godzinę pliku z bieżącym znacznikiem czasu.
jeśli plik nie istnieje, tworzy nowy plik z datą i godziną.

vi edytor służy do edycji plików, jeśli plik nie istnieje, tworzy nowy plik, chyba że plik nie zostanie zapisany.

Premraj
źródło