":> файл" VS "> файл" - PullRequest
       20

":> файл" VS "> файл"

5 голосов
/ 18 марта 2010

Есть ли различия между ":> file" и "> file" ?

$ : > 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

Ответы [ 4 ]

4 голосов
/ 22 марта 2010

Использование : > file.out более переносимо для не-bash. Например, zsh определяет нулевую команду по умолчанию как cat, а не : (если только не в режиме эмуляции). Если вам когда-нибудь понадобится заставить скрипт работать с /bin/sh, который не является bash (например, система * BSD, любая ОС с закрытым исходным кодом или даже в некоторых дистрибутивах GNU / Linux, где используется dash), Вы сделаете свою жизнь проще, если будете использовать : > file.out

4 голосов
/ 18 марта 2010

: - это встроенная оболочка NO-OP или нулевая операция.Так что да, направление его в файл заканчивается пустым файлом, равно как и направление в файл ничего.Я полагаю, что в каком-то смысле ваш источник - это нечто другое, но результат тот же.Согласно расширенному руководству по сценариям Bash , формулировка "> file.out" не будет работать на некоторых системах.

Обратите внимание, что в обоих случаях (в отличие от "touch") содержимое файла будетзаменить ничем, если файл уже существует.

2 голосов
/ 31 июля 2011

Согласно POSIX, оба работают, но версия с : прерывается, если перенаправление не удается, в то время как версия только с перенаправлением просто возвращает ненулевой статус выхода. В последнем случае это более портативно для использования true.

Bash делает это только в режиме POSIX.

Псевдонимы или функции с именем : нарушают ограничение POSIX для приложения и не являются переносимыми.

1 голос
/ 19 марта 2010

Единственное отличие, которое я могу себе представить, состоит в том, что вы можете переопределить : с помощью псевдонимов или определений функций. Например, вы можете захотеть обрезать файлы большую часть времени (используя стандартное поведение бездействия :), но в некоторых случаях вынуждает файлы иметь стандартный заголовок. Форма > 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
...