sed -iがシンボリックリンクをファイルに置き換えるのはなぜですか? [コピー]

sed -iがシンボリックリンクをファイルに置き換えるのはなぜですか? [コピー]

sed -iシンボリックリンクに編集内容を適用したときに奇妙な動作が見つかりました。文書には-i内部編集があることがわかります。ただし、シンボリックリンクはファイルに置き換えられます。

再現段階:

cd /tmp
echo blah > foo
ln -s foo bar
sed -i -e 's/ah/ub/' bar
ls -l

結果は次のとおりです。

-rw-rw-r--. 1 arogge   arogge      5 Mar  9 15:07 bar
-rw-rw-r--. 1 arogge   arogge      5 Mar  9 15:07 foo

これは予想される動作ですか、それともバグですかsed

答え1

これは予想される動作です。

-i/フラグは--in-placeファイルの一時コピーを編集し、コピーを元のファイルの上に移動します。

だからあなたがするとき:

sed -i 'bla' symlink

sedがすることは次のとおりです。

sed 'bla' symlink > temp_file
mv temp_file symlink

したがって、その場所に通常のファイルを配置してシンボリックリンクを切断します。

以下から取得した情報コメント存在するsed -iがシンボリックリンクを破るのを防ぐ方法は?

答え2

完全なリストには次の内容が含まれていますか?

lrw-rw-r--. 1 arogge arogge 5 Mar 9 15:07 bar-e -> foo

これは予想される動作です。 sed のマニュアルページから

-i 拡張

ファイルをその場で編集し、指定した拡張子でバックアップを保存します。

sed は -e を -i の拡張として解釈するようです。

関連情報