권한:
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와 유사하게 파일을 그 자리에서 편집합니다.
그리고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
답변2
따라서 문제는 스크립트가 있는 상위 경로에 있습니다. 제 생각에는 (Sed가 어떻게 작동하는지 잘 모르겠습니다) sed가 텍스트 문자열을 추가하기 위해 복제 파일을 만들려고 시도하지만 755 때문에 할 수 없습니다.길권한. 775화 문제가 해결되었습니다.