
これら2つのコマンドがファイルをゼロにする方法に違いはありますか?後者は前者より短い方法ですか?後ろで何が起こるのか?
両方
$ cat /dev/null > file.txt
$ > file.txt
生産する
-rw-r--r-- 1 user wheel 0 May 18 10:33 file.txt
答え1
cat /dev/null > file.txt
は猫の無駄な使用。
デフォルトでは何も出力されcat /dev/null
ませcat
ん。はい、うまくいきます。しかし、外部プロセスへの不要な呼び出しを引き起こすので、多くの人が眉をひきます。
これは一般的なために起こっていることの一つです。
justを使用すると、> file.txt
ほとんどのシェルで動作しますが、完全に移植可能ではありません。完全な移植性が必要な場合は、次の方が良いオプションです。
true > file.txt
: > file.txt
:
および/またはtrue
出力データでもなく、シェル組み込みcat
(外部ユーティリティ)なので、より軽くて「適切」です。
修正する:
tylerlが彼のコメントで述べたように、構文もあります>| file.txt
。
ほとんどのシェルには通過を防ぐ設定があります>
。代わりにそれを使用する必要があります>|
。これは、実際に添付しようとしたときに人のミスを防ぐためです>>
。を使用してこの動作をオンにすることができますset -C
。
したがって、ファイルを切り取る最も簡単で適切で移植可能な方法は次のとおりです。
:>| file.txt
答え2
移植性の観点から:
Bourne POSIX zsh csh/tcsh rc/es fish
> file Y Y N(1) N(1) N N
: > file N/Y(2) Y(3) Y Y(4) N(5) N(5)
true > file Y(5) Y Y Y(5) Y(5) Y(5)
cat /dev/null > file Y(5) Y Y(5) Y(5) Y(5) Y(5)
eval > file Y(3,8) Y(3) Y Y(6) Y Y
cp /dev/null file (7) Y(5) Y Y(5) Y(5) Y(5) Y(5)
printf '' > file Y(5) Y Y Y(5) Y(5) Y
メモ:
- in
sh
またはksh
エミュレーションを除いて、コマンドなしのリダイレクトの場合、zshはデフォルトのコマンドを想定します(cat
そうでない場合はstdinリダイレクトの場合のみポケットベル)、NULLCMD変数とREADNULLCMD変数を使用して調整できます。これは以下の機能に触発されました。(t)csh
:
:
UnixV7では、リダイレクトはコメントリーダーと空のコマンドの間で解釈されるため、最初は実行されません。後ですべての組み込み関数と同様に、リダイレクトが失敗した場合はシェルを終了します。:
eval
特殊な組み込み関数へのリダイレクトが失敗した場合は、シェルを終了します(bash
POSIXモードでのみ実行されます)。- 興味深いことに、空のラベル
(t)csh
が定義されているので、そこに枝があります。リダイレクトが失敗した場合は、シェルを終了します。goto
goto ''
- そのコマンドが利用できない場合
$PATH
(通常はそうではありませ:
ん。true
cat
cp
printf
- リダイレクトが失敗した場合は、シェルを終了します。
- ただし、一部の実装(GNUなど)は、
file
存在しないファイルを指す場合、シンボリックリンクの作成を拒否します。cp
- Bourne シェルの初期バージョンただし、組み込み機能のリダイレクトはサポートされていません。
読みやすさの観点から:
(この部分はとても主観的です。)
> file
。これは>
ヒントやコメントに似ているようです。また、この記事を読むときに私が尋ねたい質問は(ほとんどのシェルが同じ問題について文句を言うでしょう)です。どの出力をリダイレクトしようとしていますか?。: > file
。:
ランダムなコマンドを呼び出しました。したがって、それを直接読み取って空のファイルを生成します。しかし、これも:
簡単に見逃したり、ヒントとして受け入れることができます。true > file
:ブール値は、リダイレクトやファイルの内容とどのような関係がありますか?これはどういう意味ですか?この引用を読んだときに最初に思い浮かぶ考えは次のとおりです。cat /dev/null > file
。/dev/null
に接続されていますかfile
?cat
通常、ファイルの内容をダンプするコマンドと見なされますが、それでも意味があります。ダンプ内容これファイルを空にしてくださいfile
、話すのは少し複雑ですが、cp /dev/null file
それでも理解できます。cp /dev/null file
。コンテンツのコピー空のファイル到着するfile
。cp
基本的に何をするのかわからない人は、デバイスを作成しようとしていると思うかもしれませんが、これは意味がfile
ありますnull
。eval > file
またはeval '' > file
。何も実行せずに出力をfile
。奇妙なことに、これは一般的なイディオムではありません。printf '' > file
: 明らか印刷ファイルには何もありません。私にとって最も意味のあるもの。
パフォーマンスの観点から
違いは、組み込みシェルを使用するかどうかです。そうでない場合は、プロセスを分岐してコマンドをロードして実行する必要があります。
eval
すべてのシェルに構築が保証されます。:
可能な限りどこに組み込まれています(Bourne / cshが好き)。true
Bourneのようなシェルにのみ組み込まれています。
printf
最も近代的なBourne型シェルとfish
。
cp
そしてcat
一般的に組み込まれていません。
これでcp /dev/null file
シェルリダイレクトは呼び出されないので、次のようになります。
find . -exec cp /dev/null {} \;
以下より効率的です。
find . -exec sh -c '> "$1"' sh {} \;
(必ずしも良いわけではありませんが:
find . -exec sh -c 'for f do : > "$f"; done' sh {} +
)。
体
個人的には、私はBourneのようなシェルを使い、: > file
今はBourneのようなシェル以外には何も使用しません。
答え3
一度見たいと思うかもしれませんtruncate
。ファイルを切り取ることです。
たとえば、
truncate --size 0 file.txt
を使用するよりもこれが良いかもしれませんtrue > file.txt
。
しかし、私の主なポイントは次のとおりです。truncate
ファイルの切り捨てに使用されますが、>を使用するとファイルが切り捨てられる副作用があります。
答え4
私はこれがよりきれいに見え、誰かが誤ってReturnキーを押したように見えないので、これが好きでよく使用されます。
echo -n "" > file.txt
それも組み込まれているはずですか?