": > 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
:
シェル組み込み NO-OP またはヌル操作です。つまり、ファイルに何も送信しない場合と同様に、ファイルに送信すると空のファイルになります。あなたのソースは別の種類の無であるという意味があると思いますが、結果は同じです。高度な Bash スクリプト ガイドによると、" > file.out
" 式は一部のシステムでは機能しません。
どちらの場合も (「touch」とは異なり)、ファイルが既に存在する場合、ファイルの内容は何も置き換えられないことに注意してください。
を使用: > file.out
すると、非 bash への移植性が向上します。たとえば、zsh はデフォルトのヌル コマンドをcat
, not :
(エミュレーション モードでない限り) として定義します。スクリプトを bash 以外で動作させる必要が/bin/sh
生じた場合 (たとえば、*BSD システム、ソースがクローズドな OS、またはダッシュが使用されている一部の GNU/Linux ディストリビューションでさえ)、次のことを行います。使えば生活が楽になる: > file.out
POSIX によると、どちらも機能し:
ますが、リダイレクトのみのバージョンはゼロ以外の終了ステータスを返すだけで、リダイレクトが失敗した場合は中止されます。後者の場合、移植性が高くなりますtrue
。
Bash は POSIX モードでのみこれを行います。
指定されたエイリアスまたは関数:
は、アプリケーションの POSIX 制約に違反しているため、移植できません。
私が考えることができる唯一の違いは、:
エイリアスまたは関数定義を介して再定義できることです。たとえば、ほとんどの場合はファイルを切り捨てたい (デフォルトの何もしない動作を使用して:
) 場合がありますが、場合によってはファイルに強制的に標準ヘッダーを持たせることができます。フォーム> 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