権限:
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とは対照的です。
-i extension
-I と同様に、ファイルをその場で編集します。
-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
答え2
したがって、問題はスクリプトがある親パスにあります。私の考えでは(Sedがどのように機能するのかわかりません)、sedはテキスト文字列を追加するために複製ファイルを作成しようとしましたが、755のためにできません。道権限。第775話 問題が解決しました。