質問
何か違いはありますか? ":> ファイル」 そして > ファイル」?
$ : > 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
" へ製剤は、いくつかのシステムでは動作しません。
(「タッチ」とは違って)どちらの場合も、ファイルの内容は、ファイルがすでに存在する場合は何も置き換えられますことを。
注意他のヒント
: > file.out
を使用すると、非バッシュによりポータブルです。例えば、zshのは、(エミュレーションモードでないかぎり)cat
ない、:
としてデフォルトのヌルコマンドを定義します。あなたは今まで(例えば、*のBSDシステム、任意のクローズドソースのOS、あるいは今でもいくつかのGNU / Linuxディストリビューションで、ダッシュが使用されている場合)、あなたの」bashのではありません/bin/sh
でスクリプトを動作させるために必要終わる場合あなたが: > 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