Почему при создании пустого файла «touch file» предпочтительнее, чем «>> file»?

33

Никогда не понимал, что вы можете сделать это до сих пор:

: >> file

Похоже, что функционально похож на:

touch file

Есть ли причина, по которой большинство ресурсов предпочитают использовать эту встроенную оболочку?

Гарольд Фишер
источник
7
Краткая форма может быть связана с оболочкой, а touch - это отдельная команда. Следовательно, краткая форма зависит от того, какую оболочку вы используете (и у людей действительно есть сильные предпочтения в этой области), поскольку, возможно, не все из них предоставляют ярлык. touchбыть автономным будет работать так же, как вы должны использовать.
Патрик Мевзек
6
Первый пример следует отредактировать : >> fileили даже отредактировать >> file, чтобы они имели одинаковый эффект, т.е. НЕ уничтожали содержимое файла.
user000001
2
touchпрежде всего обновляет mtime. Он не очищает существующий файл в отличие от >.
rexkogitans
2
Ни одна из команд "не создает пустой файл"; они имеют этот результат, только если файл еще не существует. Чтобы гарантировать пустой файл, вам нужно > file.
Алексис

Ответы:

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
DopeGhoti
источник
6
Кажется >> file, не будет обновлять время изменения. Не то, что ищет OP, а просто хотел отметить, что это не полная альтернатива для прикосновения.
Jesse_b
2
Поскольку в вопросе не указана конкретная оболочка. Было бы хорошо отметить, что > fileв zsh это эквивалентно cat > file, а не : > file.
JoL
Также tcsh позволяет : > file, но ошибается > file. Может быть, эквивалентность > fileto : > fileограничена оболочкой bourne и bash?
JoL
+1 для полноты, однако обратите внимание, что в нескольких основных оболочках (я бы даже догадался, все или большинство оболочек, потому что самая простая реализация естественным образом приведет к тому, что это будет работать как побочный эффект), вы можете коснуться нескольких файлов с помощью перенаправления оболочки: : >foo >barили : >>foo >>barбудет коснитесь fooи bar.
mtraceur
Только чтобы быть педантичным из-за контекста актуального вопроса здесь, но : >foo >barне будет touchфайлов; он перенаправит (нулевой) вывод : в файлы. touchбудет трогать файлы. (:
DopeGhoti
32

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

Другая проблема заключается в том, что когда вы пишете учебник, очень важно понимать, что ваши читатели, вероятно, не очень хорошо разбираются в предмете. Простая команда может быть гораздо более понятной, чем какая-то странная комбинация не буквенных символов. Я ожидаю, что есть ряд случайных пользователей оболочки, которые не знают, что это :такое, по той простой причине, что она ничего не делает . Точно так же для простого > fooбез команды: даже если вы знаете, что такое перенаправление, перенаправление без источника может быть не интуитивным.

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

ilkkachu
источник
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". Вместо этого, поиск двоеточия даст много ложных срабатываний, если вы не знаете, какое именно имя файла искать.

B из C
источник