
から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
、それが何を意味するのか、どのような役割を果たすのか疑問に思います。
答え1
GNUユーティリティの場合、ドキュメント全体はinfo
次のページにあります。
-f
無視されます。 「タッチ」のBSDバージョンと互換性があります。
バラより歴史的なBSDタッチマニュアルページ、-f
どこへ行くか力触れる。
その昔のBSDのソースコードを見るとutimes()
システムコールがないのでtouch
読み取り+書き込みモードでファイルを開き、1バイトを読み取り、逆追跡して書き換えることで、最後のアクセスと最後の修正時間を更新します。。
明らかに両方が必要です。読むそして書く権限(touch
access(W_OK|R_OK)
falseを返すと、これを行う必要はありません。)。-f
この問題を解決しよう一時的に権限を0666に変更します。!
0666 は、誰もが読み取りおよび書き込み権限を持っていることを意味します。そうでなければ(0600のようなより制限的な権限を使用するように依然として許可されます)触れる)これは、この短期間でファイルへの読み取りまたは書き込みアクセス権を持つプロセスがアクセスできなくなり、破損する可能性があることを意味します。特徴。
ただし、これはファイルにアクセスできなかったプロセスがファイルを開くチャンスが短くなり、ファイルを破棄することを意味します。安全。
これはあまり賢いことではありません。現代touch
の実装ではこれを行いません。その時から、utime()
システムコールファイルの内容と混ざらず(非正規ファイルでも機能することを意味する)、変更とアクセス時間を独立して変更できるようにするために導入されており、書き込みアクセスのみが必要です。
このオプションが渡されると、GNUはtouch
まだ失敗せずに-f
フラグを無視します。これにより、以前のバージョンのBSD用に作成されたスクリプトをGNUシステムに移植する際に失敗しません。最近はあまり関連性がありません。
答え2
-f
何もしませんでした。これは記録の互換性(touch
および参照によるとBSDとの互換性info touch
)のために維持されるため、その存在を期待するアプリケーションはそれを通過できず、存在しないというエラーメッセージを返します。これがGNU coreutilsであると仮定すると、次のようになります。ソースコードからこれはbreak
オプション処理スイッチの外側の操作のみを行います。
無視されるオプションとして、-f
1992年に追加されたGNUコマンドの最初のバージョン以降に存在しましたtouch
(違いを見る)。少なくともFreeBSD v9では、-f
「ファイル権限が現在許可されていなくても強制的に更新しようとする」ようです(Sukmininderが発見しました。ありがとうございます)。
答え3
いつでも--help 出力またはマンページに「オプション X を無視しました」と表示されます。これは次のことを意味します。受け入れるオプションX - 構文エラーは発生しませんが、効果はありません。プログラムは、このオプションがない場合と同じことを行います。
他の答えが示すように、これは以前のバージョンとの互換性のために行われます。オプション使用されるどのような効果を出すためには、それが何であれ、もはや有用ではなく、オプションに関係なく同じことを行うことが正しい互換性動作です。
答え4
コメントを読みながら過去のソースコード、22行目:
22 -f (ignored)\n\
-f オプションは Jim Meyering の初期リリース以降は無視されます。
何もしないオプションを処理するスイッチステートメントの明示的なケース(150/151行)があります。
150 case 'f':
151 break;
次の著者が1992年以来このオプションを無視した理由は注目に値します。 -fオプションが必要なユースケースがあるか、中断される可能性がありますか?