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 不起作用?我使用相同的用户和相同的文件。好吧,楼主是root,但我有读写权限

 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]

就地编辑文件(如果提供了后缀,则进行备份)

请注意括号或缺少括号。

另外,在 shell 中-i''与 just 相同-i,只是删除了空字符串周围的引号。

因此,sed您所要求的是创建一个扩展名为 的备份文件-e,除非您也对该目录具有写入权限,否则您将无法执行此操作。


即使没有参数或空参数-ised也可能会创建一个临时文件,在将结果移动到原始名称之前将其写入其中。至少 GNU sed 在与原始目录相同的目录中创建临时文件,因此您再次需要对该目录具有写入权限。

$ strace -etrace=open,重命名 sed -i -e '1d' foo
[...]
打开(“foo”,O_RDONLY)= 3
打开(“./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章 问题解决了。

相关内容