权限:
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 相反。
-i extension
与 -I 类似,就地编辑文件
-i[SUFFIX], --in-place[=SUFFIX]
就地编辑文件(如果提供了后缀,则进行备份)
请注意括号或缺少括号。
另外,在 shell 中-i''
与 just 相同-i
,只是删除了空字符串周围的引号。
因此,sed
您所要求的是创建一个扩展名为 的备份文件-e
,除非您也对该目录具有写入权限,否则您将无法执行此操作。
即使没有参数或空参数-i
,sed
也可能会创建一个临时文件,在将结果移动到原始名称之前将其写入其中。至少 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章 问题解决了。