空のファイルを作成するときに、「:>> file」よりも「touch file」を好むのはなぜですか?


33

今までこれを行うことができることに気づいたことはありません。

: >> file

機能的には次のように思われます:

touch file

ほとんどのリソースがこの組み込みシェルよりもタッチを好むように見える理由はありますか?


7
短い形式はシェルに関連する場合がありますが、タッチはスタンドアロンのコマンドです。したがって、すべてのショートカットがショートカットを提供するとは限らないため、短い形式は使用するシェルに依存します(そして、この分野で人々は強い好みを持っています)。touchスタンドアロンであることは、使用するものが何であれ同じように機能します。
パトリックメヴゼク


6
最初の例はに、: >> fileまたはに編集し>> fileて、同じ効果、つまりファイルの内容を破壊しないようにします。
user000001

2
touch主にmtimeを更新します。とは異なり、既存のファイルを空にしません>
rexkogitans

2
どちらのコマンドも「空のファイルを作成しません」。ファイルがまだ存在しない場合にのみ、この結果が得られます。空のファイルを保証するには、が必要> fileです。
アレクシス

回答:


47

使用する必要さえありません:。あなただけのことができます> file(少なくともでbash、他のシェルは異なる挙動を示す場合があります)。

実際的には、ここで実際の違いはありません(ただし、呼び出しのわずかなオーバーヘッドは問題/bin/touchです)。

touchただし、コンテンツを変更または消去することなく、既存のファイルのタイムスタンプを変更するために使用することもできます。さらに、すでに存在するもの> fileを吹き飛ばしfileます。これは代わりにを使用して回避できます>> file

もう1つの違いtouchtouch foo bar baz quux、各ファイルに独自のリダイレクト(例>foo >bar >baz >quux)が必要なリダイレクトよりも簡潔な構文で複数のファイルを一度に作成(またはタイムスタンプを更新)できることです(例)。

を使用してtouch

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

リダイレクトの使用:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018

6
>> file変更時刻は更新されないようです。OPが探しているものではありませんが、それはタッチに完全に代わるものではないことを指摘したかっただけです。
Jesse_b

2
質問は特定のシェルを指定しないためです。> filezsh cat > fileではでなくであることに注意してください: > file
-JoL

また、tcshはを許可します: > fileが、エラーが発生し> fileます。> fileto の等価性は: > file、bourne shellとbashに限定されているのでしょうか?
JoL

+1は徹底のために、しかし、あなたはシェルのリダイレクトを使用して複数のファイルに触れることができるいくつかの主流のシェル上で(最も単純な実装は当然副作用としての仕事には、この原因となるので、私もすべて、またはほとんどのシェルを推測する)ことに注意してください。: >foo >barまたは: >>foo >>bar意志両方に触れるfoobar
mtraceur

ここでの実際の質問のコンテキストのためだけに教訓的で: >foo >barありtouch、ファイルではありません。それはの(ヌル)の出力をリダイレクトします: のファイル。 touchファイルに触れます。(:
DopeGhoti

32

touch余分な特殊文字を入力せずに一度に複数のファイルを作成できるためです。これには、ブレースの展開などが含まれtouch file{1,2,3,4}ます。

別の問題は、チュートリアルを書いているとき、読者がおそらくその主題にあまり精通していないことを認識することがかなり重要であることです。単純なコマンドは、文字以外の文字の奇妙な組み合わせよりもはるかに理解しやすい場合があります。:本当に何もしないという単純な理由から、何が何なのかわからないカジュアルなシェルユーザーがたくさんいると思います。同様に、> fooコマンドのないプレーンの場合:リダイレクトとは何かを知っていても、ソースのないリダイレクトは直感的ではない場合があります。

また、unix.seでは、プロンプトを示すために先頭にドル記号を付けたコマンドサンプルを頻繁に記述します。行頭の特殊文字はそれと混同される可能性があります。(>デフォルトのプロンプトの一部として使用するシステムとシェルがあることに注意してください。)


4
コマンドが完全に理解されていない場合は、常に「マンタッチ」があります。"man:> file"が有用なものを返すとは思わない:-)また、WRTプロンプトもあります。私はシステム名(多くのリモートxtermを使用しているため)と現在のディレクトリを表示し、システムごとに異なる色に設定されています。
-jamesqf

1
@jamesqf、うん。さて、もちろん、help :あなたのシェルがドキュメントのために持っているものは何でもあります。しかし:、それはそれ自体がコマンドとして認識され、すべてがマニュアルページを持っているわけではないことを覚えて、最後に:ドキュメントで見つけることができる必要があります。最後の部分は非常に難しい場合があります。:D
イルッカチュ

@jamesqf、そしてええ、私はほとんどがデフォルトのプロンプトの最後のキャラクターを意味していました。
-ilkkachu

1
直観と不明瞭な構造の側面を指摘するための+1 。
mtraceur

@ilkkachu:ええ。ドキュメンテーションでコロンを見つけることはそれほど難しくありません。句読点だけではないものを見つけることは別の問題です:
jamesqf

18

まあ、私にとって、主な理由は読みやすさです。touch file何が起こっているかを知っていれば、シェルスクリプトの知識があまりない人でも、何が起こっているかを知っています。そうでない場合は、簡単にこれman touchを確認できます。

A FILE argument that does not exist is created empty

:やなどの不可解なものでは>、何が起こっているのかを知るのがより難しく、実際の利点がないため、それを使用する必要はありません。


6

/ tmpにマーカーファイルが作成されていることだけを覚えている古いシェルスクリプトの1つを探していると想像してください。すべての* .shファイルを「タッチ」という言葉で簡単にgrepできます。検索する正確なファイル名がわからない場合、代わりにコロンを削除すると、多くの誤検知が発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.