xxdコマンドにファイル変更機能はあるか
xxdコマンドが既存ファイルを更新する条件
xxdコマンドをエージェントAIに実行させる際、どのような呼び出し方であれば既存ファイルへの 変更が発生するのかを、xxd本体のソースコードに基づいて整理する。
1. 判断基準の結論
既存ファイルが更新されるかどうかを分けるのは-rオプションの有無ではない。
本質的な条件は次の2点である。
- コマンドラインにoutfile(第2引数)が指定されているか
- そのoutfileが既存のファイルパスを指しているか
この2条件が満たされる場合、-rの有無に関わらず既存ファイルは変更される。
-rが変えるのは「変更が起きるかどうか」ではなく「どのように変更されるか」である。
2. ソースコード上の根拠
vim本家のxxd.cにおける、outfileを開く処理の該当箇所は以下の通りである。
int mode = revert ? O_WRONLY : (O_TRUNC|O_WRONLY);
if (((fd = OPEN(argv[2], mode | BIN_CREAT(revert), 0666)) < 0) ||
(fpo = fdopen(fd, BIN_WRITE(revert))) == NULL)
revertは-r指定の有無を表すフラグである。ここでのモード指定が、
既存ファイルへの影響を決定づけている。
-
-rなし(revert=0):mode = O_TRUNC | O_WRONLY。O_TRUNCが付与されるため、 outfileが既存ファイルであれば開いた瞬間に中身が消去され、新たなhexdumpテキストで 上書きされる。既存内容は完全に失われる。 -
-rあり(revert=1):mode = O_WRONLY(O_TRUNCなし)。truncateされないため、 hexdump内のアドレス情報に基づき、該当オフセットのバイトだけが上書きされる (部分パッチ)。
xxdの変更履歴にも、通常モードで既存outfileがtruncateされる仕様を裏付ける記述がある。
26.09.98 Fixed: 'xxd -i infile outfile' did not truncate outfile.
3. 条件別の整理
| outfileの指定 | -rの有無 |
既存ファイルへの影響 |
|---|---|---|
| 省略(標準出力) | 問わない | 影響なし |
| 新規パス | 問わない | 影響なし(新規ファイル作成) |
| 既存ファイル | なし | truncateにより全体上書き(既存内容は完全消失) |
| 既存ファイル | あり | truncateされず、該当オフセットのみ部分的に上書き |
4. 許可判断基準への適用
既存ファイルの更新有無を判定する一次条件は、「outfileが指定され、かつそれが既存ファイルを
指しているか」である。この条件に該当する場合は、-rの有無を問わず常に
「既存ファイルへの書き込みが発生するコマンド」として扱うべきである。
その上で-rの有無は、影響の性質を分類する二次的な指標として利用できる。
-rなし:全体破壊型(既存内容が丸ごと失われる)-rあり:局所改ざん型(一部バイトのみ変わり、差分が小さく検知しづらい)
コメント
コメントを投稿