sedコマンドで置換すると、symlink が壊れる。
sed -i
でファイルを置換するときのリンクファイルの扱い。
実験
echo xxx > a ln -sr a b sed -i "s|xxx|yyy|" a b # bは通常ファイルになる。
sed を使うときには絶対に知っておかなくてはいけない。
シンボリックリンクは破壊される。
b はシンボリックリンクだったが、sed -i
すると、置換されて「通常ファイルになる。」
takuya@:~$ ls -l a b -rw-rw-r-- 1 takuya takuya 4 4月 5 20:12 a -rw-rw-r-- 1 takuya takuya 4 4月 5 20:12 b
対策
sed --follow-symlinks
echo xxx > a ln -sr a b sed --follow-symlinks -i "s|xxx|yyy|" a b # bは維持される。
結果
ちゃんとシンボリックリンクが維持される。
takuya@:~$ ls -l a b -rw-rw-r-- 1 takuya takuya 4 4月 5 20:18 a lrwxrwxrwx 1 takuya takuya 1 4月 5 20:17 b -> a
POSIX/bsdの場合
対策はわからない。作業前に自分で注意するしかすべが無い。ってかいたけど、-i
を使ってた上でやり方はわからないってだけす。
cat FILE | sed '/xxx/yyy/' > FILE
cat して sed するとか、やりようはあります。ただ、、、FILE名を2回もかくのだるいよね。
dockerfileで注意
dockerfile などでは、sedが多様されますが、リンクを壊さないように十分に注意
gnu コマンドは便利
今回の記事のような理由で、gnu sedが無いととても不便です。それでもPOSIX互換にこだわりますか?
POSIX至上主義は捨ててGNU至上主義になればいいんじゃないかな。
2022-04-07 追記
「完璧より、完成を目指す」っていう考え方も、また大事だと思う