それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

sedコマンドが、シンボリックリンク考慮しないが、gnu sedはなんとかなる

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

対策

GNU sedの場合、次のようにするといい。

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 追記

「完璧より、完成を目指す」っていう考え方も、また大事だと思う