Dlaczego podczas tworzenia pustego pliku można preferować „plik dotykowy” zamiast „>> plik”?


33

Nigdy nie zdawałem sobie sprawy, że możesz to zrobić do tej pory:

: >> file

Wydaje się być funkcjonalnie podobny do:

touch file

Czy istnieje powód, dla którego większość zasobów wydaje się woli dotykać tej wbudowanej powłoki?


7
Skrócony formularz może być powiązany z powłoką, podczas gdy touch jest samodzielnym poleceniem. Dlatego krótka forma zależy od tego, z której powłoki korzystasz (a ludzie mają silne preferencje w tym obszarze), ponieważ być może nie wszystkie z nich zapewniają skrót. touchsamodzielność będzie działać w ten sam sposób, niezależnie od tego, czego powinieneś używać.
Patrick Mevzek,


6
Pierwszy przykład powinien być edytowany : >> filelub nawet >> file, aby miały ten sam efekt, tj. NIE niszczą zawartości pliku.
user000001

2
touchprzede wszystkim aktualizuje mtime. W przeciwieństwie do tego nie opróżnia istniejącego pliku >.
rexkogitans

2
Żadne polecenie „nie tworzy pustego pliku”; mają ten wynik tylko wtedy, gdy plik jeszcze nie istnieje. Aby zagwarantować pusty plik, potrzebujesz > file.
Alexis

Odpowiedzi:


47

Nie musisz nawet używać :; możesz po prostu > file(przynajmniej w bash; inne powłoki mogą zachowywać się inaczej).

W praktyce nie ma tutaj prawdziwej różnicy (choć drobny narzut związany z wzywaniem /bin/touchto rzecz).

touch, jednak można go również użyć do zmodyfikowania znaczników czasu w pliku, który już istnieje, bez zmiany lub usunięcia zawartości; ponadto > filezdmuchnie wszystko, fileco już istnieje. Można to obejść, używając zamiast tego >> file.

Inną różnicą touchjest to, że możesz utworzyć (lub zaktualizować znacznik czasu) wielu plików jednocześnie (np. touch foo bar baz quux) Z bardziej zwięzłą składnią niż z przekierowaniem, gdzie każdy plik wymaga własnego przekierowania (np >foo >bar >baz >quux.).

Używanie touch:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

Korzystanie z przekierowania:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018

6
Wygląda na to, >> fileże nie zaktualizuje czasu modyfikacji. Nie tego, czego szuka OP, ale chciałbym tylko podkreślić, że nie jest to kompletna alternatywa dla dotyku.
Jesse_b

2
Ponieważ pytanie nie określa konkretnej powłoki. Warto wskazać, że > filew zsh jest równoważne cat > file, a nie : > file.
JoL

Ponadto, tcsh pozwala : > file, ale nie działa > file. Może równoważność > fileto : > filejest ograniczona do bourne shell i bash?
JoL

+1 dla dokładności, jednak pamiętać, że na kilka muszli nurtu (ja nawet odgadnąć wszystkich lub większości powłok, ponieważ najbardziej prosta implementacja byłaby przyczyna to naturalnie do pracy jako efekt uboczny), można dotknąć wielu plików za pomocą powłoki przekierowanie: : >foo >baralbo : >>foo >>barbędzie dotknij zarówno fooi bar.
mtraceur

Żeby być pedantycznym z powodu kontekstu rzeczywistego pytania tutaj, ale : >foo >barnie będzie touchplików; przekieruje wyjście (zerowe) : na pliki. touchdotknie plików. (:
DopeGhoti

32

Ponieważ możesz touchjednocześnie pobierać wiele plików bez wpisywania dodatkowych znaków specjalnych. Obejmuje to rzeczy takie jak rozwijanie nawiasów klamrowych, np touch file{1,2,3,4}.

Innym problemem jest to, że pisząc samouczek, ważne jest, aby zdać sobie sprawę, że czytelnicy prawdopodobnie nie są zbyt dobrze zorientowani w temacie. Proste polecenie może być znacznie bardziej zrozumiałe niż dziwnie wyglądająca kombinacja znaków innych niż litery. Spodziewałbym się, że jest wielu zwykłych użytkowników powłok, którzy nie wiedzą, co to :jest, z tego prostego powodu, że tak naprawdę nic nie robi . Podobnie w przypadku zwykłego > foobez polecenia: nawet jeśli wiesz, co to jest przekierowanie, przekierowanie bez źródła może być nieintuicyjne.

Również tutaj na unix.se często piszemy próbki poleceń z wiodącym znakiem dolara, aby wskazać monit. Znaki specjalne na początku wiersza mogą być z tym mylone. (Zauważ, że istnieją systemy i powłoki, które używają >jako części domyślnego monitu).


4
A jeśli polecenie nie jest w pełni zrozumiałe, zawsze występuje „dotyk człowieka”. Wątpię, aby „man:> plik” zwrócił cokolwiek przydatnego :-) Również podpowiedzi WRT, niektóre (być może większość) pozwalają ustawić monit tak, aby był dowolny. Mój pokazuje nazwę systemu (ponieważ używam wielu zdalnych xtermów) i bieżący katalog i jest ustawiony na różne kolory dla różnych systemów.
jamesqf

1
@jamesqf, tak. Teraz oczywiście istnieje również help :dokumentacja dla powłoki. Ale to wymaga rozpoznania :jako polecenia samego w sobie, pamiętania, że ​​nie wszystko ma stronę :podręcznika , i wreszcie, możliwości znalezienia się w dokumentacji. Ostatnia część może być dość trudna. : D
ilkkachu

@jamesqf i tak, głównie miałem na myśli ostatni znak domyślnego monitu.
ilkkachu

1
+1 za wskazanie aspektów intuicyjnych i niezrozumiałych konstrukcji.
mtraceur

@ilkkachu: Tak. Znalezienie dwukropków w dokumentacji nie jest takie trudne: znalezienie tego, który nie jest tylko interpunkcją, to inna sprawa :-)
jamesqf

18

Cóż, dla mnie głównym powodem jest czytelność. Gdy touch filewiesz, co się dzieje, nawet ktoś niezbyt wykształcony w skryptach powłoki wie, co się dzieje. A jeśli nie, łatwo to zrobić man touchi zobaczyć:

A FILE argument that does not exist is created empty

W przypadku takich tajemniczych rzeczy, jak :i >, trudniej jest wiedzieć, co się dzieje, a ponieważ nie ma prawdziwej przewagi, nie trzeba z tego korzystać.


6

Wyobraź sobie, że szukasz jednego ze swoich starych skryptów powłoki, o których pamiętasz tylko, że tworzony jest plik znacznika w / tmp. Łatwo jest grepować wszystkie swoje pliki * .sh dla słowa „dotyk”. W zamian za dwukropek przyniesie wiele fałszywych trafień, jeśli nie wiesz, której dokładnie nazwy pliku szukać.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.