Створюючи порожній файл, чому б можна віддати перевагу "торкнутися файлу" над ": >> файл"?


33

Ніколи не зрозумів, що ти можеш це зробити до цього часу:

: >> file

Він, схоже, функціонально схожий на:

touch file

Чи є причина, чому, здається, більшість ресурсів вважають за краще торкатися цієї вбудованої оболонки?


7
Коротка форма може бути пов'язана з оболонкою, тоді як дотик - це окрема команда. Отже, коротка форма залежить від того, яку оболонку ви використовуєте (а люди мають сильні переваги в цій галузі), оскільки, можливо, не всі вони надають ярлик. touchавтономна робота буде працювати так само, як би ви не використовували.
Патрік Мевзек


6
Перший приклад слід відредагувати до : >> fileабо навіть >> file, щоб вони мали однаковий ефект, тобто НЕ знищували вміст файлу.
user000001

2
touchнасамперед оновлює mtime. Він не спорожнює існуючий файл на відміну від >.
rexkogitans

2
Жодна команда "створює порожній файл"; вони мають цей результат, лише якщо файл ще не існує. Щоб гарантувати порожній файл, вам потрібно > file.
alexis

Відповіді:


47

Вам навіть не потрібно користуватися :; можна просто > file(принаймні, в bashінших; снаряди можуть поводитися інакше).

На практиці, тут немає ніякої реальної різниці (хоча мінусовий накладний виклик /bin/touch- це річ).

touchоднак, також можна використовувати для зміни часових позначок у файлі, який вже існує, не змінюючи або стираючи вміст; далі > fileвибухне все, fileщо вже існує. Це можна вирішити, замість цього використовувати >> file.

Ще одна відмінність у touchтому, що ви можете змусити його створювати (або оновлювати часову позначку) декількох файлів одночасно (наприклад touch foo bar baz quux) з більш лаконічним синтаксисом, ніж при перенаправлення, де кожен файл потребує власного перенаправлення (наприклад >foo >bar >baz >quux).

Використання 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

Використання перенаправлення:

$ > 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
Схоже >> file, час оновлення не буде оновлено. Не те, що шукає ОП, а просто хотів зазначити, що це не є повною альтернативою дотику.
Jesse_b

2
Оскільки питання не вказує конкретну оболонку. Було б добре зазначити, що > fileв zsh еквівалентно cat > file, ні : > file.
JoL

Також tcsh дозволяє : > file, але помиляється > file. Може бути, еквівалентність > fileдо : > fileобмежена бурновою оболонкою та баштом?
JoL

+1 для ґрунтовності, однак зауважте, що на декількох основних потоках оболонок (я б навіть здогадувався про всі або більшість оболонок, оскільки найпростіша реалізація природно спричинила б це як побічний ефект), ви можете торкнутися декількох файлів за допомогою перенаправлення оболонки: : >foo >barабо : >>foo >>barбуде торкнутись fooі bar.
mtraceur

Тільки бути педантичним через контекст актуального питання тут, але : >foo >barне touchфайли; він перенаправить (null) вихід : у файли. touchторкнувся б файлів. (:
DopeGhoti

32

Тому що ви можете touchдекілька файлів одночасно, не набираючи зайвих спеціальних символів. Це включає такі речі, як розширення дужок, наприклад touch file{1,2,3,4}.

Інше питання полягає в тому, що, коли ви пишете підручник, досить важливо усвідомити, що ваші читачі, мабуть, не дуже добре розбираються в темі. Проста команда може бути набагато зрозумілішою, ніж якась дивна комбінація символів, що не букв. Я би сподівався, що існує ряд випадкових користувачів оболонок, які не знають, що :таке, з тієї простої причини, що вона насправді нічого не робить . Аналогічно і для звичайної > fooбез команди: навіть якщо ви знаєте, що таке перенаправлення, перенаправлення без джерела може бути неінтуїтивним.

Крім того, тут на unix.se ми часто пишемо зразки команд із провідним знаком долара, щоб вказати на підказку. Спеціальні символи на початку рядка можуть бути переплутані з цим. (Зверніть увагу, що є системи та оболонки, які використовуються >як частина запиту за замовчуванням.)


4
І якщо команда не зрозуміла повністю, завжди є "людина дотик". Я сумніваюся, що "man:> file" поверне щось корисне :-) Також WRT-підказки, деякі (можливо, більшість) дозволяють вам встановити підказку будь-що вам подобається. Шахта показує ім'я системи (тому що я використовую багато віддалених xterms) та поточний каталог, а також встановлюється на різні кольори для різних систем.
jamesqf

1
@jamesqf, так. Тепер, звичайно, також є help :або все, що має оболонку, для документації. Але для цього потрібно розпізнати :як команду саме по собі, пам’ятаючи, що не все має чоловічу сторінку, і, нарешті, вміти знайти :в документації. Остання частина може бути досить складною. : D
ilkkachu

@jamesqf, і так, я здебільшого мав на увазі остаточний символ підказки за замовчуванням.
ilkkachu

1
+1 для вказівки на аспекти інтуїції та не-існування-незрозумілого.
mtraceur

@ilkkachu: Так. Знайти кольори в документації не так вже й складно: знайти той, який не є лише пунктуацією, - інша справа :-)
jamesqf

18

Ну, для мене першопричиною є читабельність. З тим, що touch fileви знаєте, що відбувається, навіть хтось не зовсім освічений в сценарії оболонок знає, що відбувається. А якщо ні, це легко зробити man touchі побачити це:

A FILE argument that does not exist is created empty

З криптовалютами, такими як :і >, складніше зрозуміти, що відбувається, і оскільки немає реальної переваги, не потрібно використовувати це.


6

Уявіть, що ви шукаєте один зі своїх старих скриптів оболонки, з яких ви пам’ятаєте лише, що створюється якийсь маркерний файл в / tmp. Легко зібрати всі ваші * .sh файли за слово "touch". Якщо натомість двокрапка кишечника призведе до помилок, якщо ви не знаєте, яке саме ім’я файлу шукати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.