`touch`の-fオプションの使用は何ですか?


23

からman touch

-f     (ignored)

しかし、私は無視することの意味がわかりません。

私は次のことを試しました:

$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file

$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file

そして、それにもかかわらず、タイムスタンプを変更することに気づきました -f

だから、私は何の-f略か、それが何をするのか知りたいです。


2
-fオプションは無視されるだけだと思います。たぶん、引数パーサーを介してマングルされ、それだけです。
トーマス

1
(無視)は、コマンドではなくフラグが無視されることを意味します。
ファンドモニカの訴訟

回答:


47

GNUユーティリティの場合、完全なドキュメントはinfoページにあり、ここで読むことができます。

-f
無視されます。`touch 'のBSDバージョンとの互換性のため。

参照してくださいタッチのための歴史的なBSDのmanページ-fした強制的なタッチを。

これらの古いBSDのソースを見ると、utimes()システムコールがなかったためtouch、ファイルを読み取り+書き込みモードで開き、1バイトを読み取り、シークしてもう一度書き込み、最後のアクセスと最後の変更時刻を更新します

明らかに、読み取り書き込みの両方のアクセス許可が必要でした(falseが返さtouchれた場合、そうすることを避けaccess(W_OK|R_OK)ます)。一時的にアクセス許可を0666に一時的に変更することで、この問題を-f回避しようとしました!

0666は、すべてのユーザーに対する読み取りおよび書き込み許可を意味します。それ以外の場合(タッチを許可した0600などのより制限されたアクセス許可の場合など)は、その短いウィンドウの間に、ファイルの読み取りまたは書き込みアクセス許可を持つプロセスはこれ以上はできないことを意味する必要がありました、機能を壊します

ただし、そうしないと、ファイルにアクセスできないプロセスは、ファイルを開く短い機会になり、セキュリティが破壊されます

それはあまり賢明なことではありません。現代のtouch実装ではそれを行いません。それ以降、utime()システムコールが導入され、ファイルのコンテンツと混ざることなく変更とアクセス時間を個別に変更できるようになりました(つまり、非正規ファイルでも動作します)。そのための書き込みアクセスのみが必要です。

GNU touch-fオプションを渡しても失敗しませんが、フラグを無視します。そうすれば、これらの古いバージョンのBSD用に作成されたスクリプトは、GNUシステムに移植しても失敗しません。最近はあまり関係ありません。


3
developer.apple.com/library/mac/documentation/Darwin/Reference/…に よると-f、Mac OS Xでも機能します(ただし、GUIを使用して同じ機能を「より良い」方法で実行する方法が少なくとも57あることは間違いありません。 )
alephzero

20
GUIの使用は必ずしも「より良い」というわけではありません。スクリプトを使用するポイントは、スクリプトを可能な限り多くのunixy方言で、または少なくとも遭遇する可能性のあるほとんどの方言で変更せずに実行することを含むものを自動化することです。 。
Guntram Blohmは

@alephzeroこれは、OS XのバージョンがBSDバージョンであり、GNUが互換性を維持しているためです。
バーマー

14

-f何もしません。歴史的な互換性のために保持されています(にtouchよるとBSD との互換性があるためinfo touch)、存在することを期待しているアプリケーションはパスせず、存在しないというエラーメッセージを返します。これがGNU coreutilsであると仮定すると、ソースでは、これはbreak何もせずにオプション処理スイッチから外れているだけであることがわかります。

無視されるオプションとして、1992年に追加され-fたGNU touchコマンドの最初のバージョンから存在します(diffを参照)。少なくともFreeBSD v9では、-f「ファイルのアクセス許可が現在許可していない場合でも、強制的に更新を試みます」(Sukminderに感謝)。


2
infoページには「無視
heemayl

@heemayl touchに "-f"引数を付けて出荷されているように見えるBSDを見つけることができなかったので、かなり古いものでなければなりません。
クリスダウン

うーん..私はCoreutilsのマニュアルをチェックしました。「無視されました; BSDバージョンのtouchとの互換性のためです。」
Pandya

3
-fis / wasは、ファイルのアクセス許可でBSDで許可されていたとしても、強制的に更新を試みるために使用されました。V10ではなくv9:freebsd.org/cgi/…(少なくともFreeBSDの)。
ルニウム

@sukminderエース、ありがとう!回答にあなたの情報を追加します。
クリスダウン

12

--help出力またはマンページに「オプションXが無視されます」と表示される場合は常に、プログラムオプションXを受け入れます—構文エラーは発生しませんが、効果はありません。プログラムは、オプションがない場合と同じことを行います。

他の回答が示すように、これは後方互換性のために行われます。何らかの効果をもたらすために使用されるオプションは、それが何であれもはや有用ではなく、オプションに関係なく同じことを行うことは正しい互換性の動作です。


0

歴史的なソースコードの 22行目のコメントを見ると:

  22   -f                     (ignored)\n\

-fオプションは、Jim Meyeringによる最初のリリース以降無視されることを意図していました。

また、オプションを処理するswitchステートメントには、何もしない明示的なケース(行150/151)があります。

 150         case 'f':
 151           break;

1992年以降、このオプションを無視し続けようとする著者の動機は驚くべきものです。たぶん、オプション-fを必要とする使用シナリオがあり、それ以外の場合は中断しますか?

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