Есть ли какие-либо различия между ":> файл" и "> файл"?":> файл" 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
Есть ли какие-либо различия между ":> файл" и "> файл"?":> файл" 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
:
является оболочкой встроенным NO-OP или нулевой операции. Так что да, направляя его в файл, заканчивается пустым файлом, как и ничего не направляет в файл. Полагаю, есть смысл, в котором ваш источник - это совсем другое, но результат тот же. Согласно to the advanced Bash scripting guide, формулировка «> file.out
» не будет работать в некоторых системах.
Обратите внимание, что в обоих случаях (в отличие от «touch») содержимое файла будет заменено ничем, если файл уже существует.
Единственное отличие, о котором я могу думать, это то, что вы можете переопределить :
через псевдоним или определения функций. Например, вы можете захотеть обрезать файлы большую часть времени (используя по умолчанию поведение 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
Использование : > file.out
более компактен, чтобы не-Баш. Например, zsh определяет нулевую команду по умолчанию как cat
, а не :
(если только в режиме эмуляции). Если вам когда-либо понадобится заставить скрипт работать с /bin/sh
, который не является bash (например, * BSD-система, любая ОС с закрытым исходным кодом или даже в некоторых дистрибутивах GNU/Linux сейчас, где используется тире) сделаю вашу жизнь проще, если вы используете : > file.out
Согласно POSIX, оба работают, но версия с :
прерывается, если перенаправление завершилось неудачно, в то время как версия только с переадресацией возвращает только нулевой статус выхода. В последнем случае более удобно использовать true
.
Bash только делает это прямо в режиме POSIX.
Псевдонимы или функции с именем :
нарушают ограничение POSIX приложения и не переносятся.
Не могли бы вы привести пример, как переопределить: через псевдоним или определения функций? –
псевдоним: = 'rm -fr /' и:() {rm -fr /; } –