Есть ли любые различия между ":> файл" и"> файл"?
$ : > file.out
$ ls -l file.out
-rw-rw---- 1 user user 0 Mar 18 21:08 file.out
$ > file.out
$ ls -l file.out
-rw-rw---- 1 user user 0 Mar 18 21:08 file.out
:
- это встроенная в оболочка NO-OP или нулевая операция. Так что да, направление его в файл заканчивается пустым файлом, как и ничего не направление в файл. Я полагаю, что в каком-то смысле ваш источник - это нечто иное, но результат тот же. Согласно расширенному руководству по написанию сценариев Bash , формулировка «> file.out
» не будет работать в некоторых системах.
Обратите внимание, что в обоих случаях (в отличие от «touch») содержимое файла будет заменено ничем, если файл уже существует.
Единственное отличие, о котором я могу думать, это то, что вы можете переопределять :
через псевдонимы или определения функций. Например, вы можете захотеть усекать файлы большую часть времени (используя стандартное поведение :
), но в некоторых случаях заставлять файлы иметь стандартный заголовок. Форма > file
не может быть переопределена.
Например:
#! /bin/bash
test -n "$ADD_COPYRIGHT" &&
:() { echo "# Copyright (c) 2010 MyName"; echo; }
# Truncate the file to zero size, unless ADD_COPYRIGHT is set, in which case
# the file is truncated to contain only a copyright notice.
: > file
# Add content to the file
some_command >> file
Использование :> file.out
более переносимо для не-bash. Например, zsh определяет нулевую команду по умолчанию как cat
, а не :
(за исключением режима эмуляции). Если вам когда-нибудь понадобится заставить скрипт работать с / bin / sh
, который не является bash (например, система * BSD, любая ОС с закрытым исходным кодом или даже сейчас в некоторых дистрибутивах GNU / Linux) , где используется тире), вы упростите себе жизнь, если воспользуетесь :> file.out