touchが新しいファイルを作成するのはなぜですか?


13

このtouchコマンドは、ファイルの最終変更日を更新するために使用されることを認識しています。要求されたファイルがファイルシステムに存在しない場合、新しいファイルを作成するためにも使用されます。

タッチ(名前が示すとおり)は、最後のmodの日付を更新するだけなので、なぜ新しいファイルを作成しようとするのですか?

それはタッチのコードで書かれた単なるチェックですか、それともファイルを作成する他の何かですか?


使用例として、touch /forcefsck空のファイルを作成/forcefsckして、次の再起動時にファイルシステムのエラーチェックを強制するために使用します。ファイル自体には何も含める必要はなく、存在する必要があります。なしtouchでは、空のファイルを使用するvinano、保存する必要があります。使用するのがはるかに速いtouch
ティム

@Tim使用できない理由>/forcefsckprintf '' >>/forcefsck、既存のコンテンツを保持する理由はありません。あなたが説明するのは、特定の方法で機能するユーティリティを使用する方法ですが、それがそのように機能するように書かれている理由とは何の関係もありません。
CVn

この質問が、touchそれがどのように機能するかではなく、設計に関するものである場合touch、ファイル作成の副作用により、単一責任原則に違反すると思います。したがって、「理由」は単に、人気と普及率/使いやすさのために立ち往生した初期の設計選択によるものです。
ジョージパンタゼス

回答:


15

strace touch t利回りの使用:

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

それはtouchのコードにあり、私はそれをチェックとは呼びません。タイムスタンプは、書き込み用にファイルを開いてから閉じるだけで更新されます。


14

touchファイルが存在しない場合、新しい空のファイルを作成します。これは、それが実行するように設計されているためです。ユーティリティには、そのケースを具体的に処理するコードが含まれている必要があります。このユーティリティはUnix V7に登場しました。そのマニュアルはこう説明しています:

touch —ファイルの最終更新日を更新

touchファイルの変更された日付を設定しようとします。これは、ファイルから文字を読み取り、書き戻すことによって行われます。**ファイル*が存在しない場合、-cオプションが指定されない限り、作成が試行されます。

touchファイルが空だったらどうしたのかわかりません。基礎となるシステムコールは後で来ました。)

なぜtouchファイルが存在するように設計されたのかはわかりませんが、それはが原因だと思われmakeます。ファイルの変更時刻を現在の時刻に設定するのはなぜですか?変更時刻を特定の時刻に設定すると便利な場合もありますが、その機能は後になって、元のtouchは修正時刻を現在の時刻にしか設定できませんでした。その理由はmake、ファイルに依存するルールを再実行するためです。

つまり、あなたがファイルを持っていると仮定しfooて、生成するコマンド宣言するメイクファイルbarからをfoo。を入力するmake barと、コマンドが実行され、bar作成されます。場合は、bar存在し、より新しいfoomake barので、何もしないmakeことを前提としてbar既に生成されています。ただし、barがより古い場合foo、makeはbarが最新ではなく、再生成する必要があると判断します。

しかし、生成するルールbarが変更された場合はどうなりますか?次に、2つのオプションがあります。

  • rm bar; make bar
  • touch foo; make bar

foo生成するには存在する必要がありますbar、ない場合、通常、コマンドは機能しません。

「タッチ」という用語もmakeユーティリティに存在しmake -t barていました。コマンドを実行するふりをするだけです。つまり、bar実際にコマンドを実行せずに、変更時刻を現在の時刻に設定しbarます。への変更fooは影響しませんbar)。touchユーティリティは、そのためのスタンドアロン版だったmake -t機能。

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