2010-03-18 5 views
5

Есть ли какие-либо различия между ":> файл" и "> файл"?":> файл" VS "> файл"

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

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

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

1

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

Не могли бы вы привести пример, как переопределить: через псевдоним или определения функций? –

+0

псевдоним: = 'rm -fr /' и:() {rm -fr /; } –

4

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

2

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

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

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

Смежные вопросы