FreeBSD sedエラー - 権限がありますが、「権限が拒否されました」

FreeBSD sedエラー - 権限がありますが、「権限が拒否されました」

権限:

ls -al file
-rwxrwxr-x  1 root  wheel 

ユーザーグループ:

groups
wheel 

私がこうすれば:

sed -i'' -e '/Marker/i\'$'\n''text string'$'\n' file 

エラーが発生します。

sed: ../file: Permission denied

ただし、同時にこのファイルを読み書きできます。権限に示されているように。

なぜsedが機能しないのですか?同じユーザーと同じファイルを使用しています。まあ、元のポスターはルートです。しかし、読み書き権限があります。

 uname -a
FreeBSD srv 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0 r306420: Thu Sep 29 01:43:23 UTC 2016     [email protected]:/usr/obj/usr/src/sys/GENERIC  amd64

ベストアンサー1

sed -i'' -e ... file 

BSDのsed必要引数-i、オプションの引数を許可するGNU sedとは対照的です。

FreeBSD sed のマニュアルページ:

-i    extension     

-I と同様に、ファイルをその場で編集します。

そしてGNU sed のマニュアルページ:

  -i[SUFFIX], --in-place[=SUFFIX]

ファイルを所定の位置に編集(またはサフィックスが指定されている場合はバックアップ)

括弧がないか不足していることに注意してください。

そうでない場合、シェルは空の文字列の周りの引用符が削除されることを除いて、-i''justと同じです。-i

だからsedあなたが要求するのは拡張子が . であるバックアップファイルを生成することですが、-eディレクトリへの書き込みアクセス権がなければこれを行うことはできません。


-i引数がないか空の場合でも、sed結果を元の名前に移動する前に結果が書き込まれる一時ファイルが生成されることがあります。少なくとも、GNU sed は元のディレクトリと同じディレクトリに一時ファイルを生成するため、そのディレクトリへの書き込み権限が再び必要です。

$ strace -etrace=open、名前変更 sed -i -e '1d' foo
[...]
open("foo", O_RDONLY) = 3
open("./sedD9J9tV", O_RDWR | O_CREAT | O_EXCL, 0600) = 4
名前変更("./sedD9J9tV", "foo") = 0

この問題を解決するには、別の場所に一時ファイルを作成し、その内容を次の場所に移動できます。

$ sed -e '...' file > /tmp/file.tmp
$ cat /tmp/file.tmp > file && rm /tmp/file.tmp

おすすめ記事