기호 링크에 대한 나의 기본적인 이해는 그것이 다른 파일에 대한 문자열 경로를 포함하는 특수 파일이라는 것입니다. 커널의 VFS는 많은 것을 추상화하지만 심볼릭 링크를 편집할 수 없는 것처럼 보이는 이유가 있습니까?
즉, 심볼릭 링크를 편집할 수 있습니까? 그렇지 않다면 왜 안 됩니까?
여러 가지 방법이 있다는 것을 이해합니다바꾸다기호 링크(현재 답변 섹션에 두 가지 대안이 있음) 그러나 대체가 기호 링크를 처리하는 유일한 방법인 것처럼 보이는 이유에 대한 설명을 듣는 것은 흥미로울 것입니다. 왜 그들이 가리키는 곳을 변경할 수 없습니까?
답변1
이것이 -f
단지 자동 교체를 수행하는 것이라는 점을 고려하면원자 교체가 가능합니다 mv -T
(/loc.../link가 디렉토리인 경우에도 -T가 작동함).:
ln -s /location/to/link linkname
# ...
ln -s /location/to/link2 newlink
mv -T newlink linkname
linkname
프로세스 전반에 걸쳐 액세스할 수 있습니다.
답변2
편집이란 가리키는 파일을 변경하는 것을 의미하는 경우 다음을 수행할 수 있습니다.
$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile
인수 -f
( )를 ln에 전달하면 이전 시스템 호출을 --force
호출하게 됩니다.unlink()
symlink()
에서 발췌스택 오버플로 답변.
답변3
심볼릭 링크는 원자적으로 수정되어야 합니다. 중간에 쓰면 작동하지 않습니다. 심볼릭 링크의 내용은 매우 작으므로(Linux의 경우 최대 4095자: 파일 경로의 최대 길이) 커널 수준에서 심볼릭 링크의 일부를 편집하는 것은 거의 의미가 없습니다. 따라서 커널은 심볼릭 링크를 편집하기 위한 인터페이스를 제공하지 않고 새 심볼릭 링크를 생성하기 위한 인터페이스, 시스템 symlink
호출(및 파일 삭제를 위한 일반 인터페이스 unlink
)만 제공합니다.
시스템 symlink
호출은 새로운 심볼릭 링크만 생성하며 기존 파일은 삭제하지 않습니다. 이는 성가신 일 open
이지만 (새 파일을 만들거나 기존 파일을 자를 수 있지만 기존 파일을 새로 만든 파일로 바꿀 수는 없음) 및 와 같은 파일을 만드는 다른 시스템 호출과 일치합니다 mkdir
.
껍질에서는당신은 알아냈어요ln
, 이 명령을 사용하여 심볼릭 링크를 자동으로 바꿀 수는 없지만 ( ln -sf
이전 파일의 링크를 해제한 다음 심볼릭 링크 만들기) 먼저 임시 이름으로 심볼릭 링크를 만든 다음 제자리로 이동하면 됩니다.
tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"
답변4
완료(과거)의 결과로 링크 이름이 존재한다고 가정합니다.
ln -s /the/path/to/a/file linkname
그러면 다음 세 가지 방법으로 기호 링크를 변경할 수 있습니다.
-f
디렉토리에 대해서도 ln 을 강제로 사용합니다-n
(inode는 재사용 가능).ln -sfn /some/new/path linkname
심볼릭 링크를 삭제하고 새 링크를 만듭니다(디렉토리의 경우에도).
rm linkname; ln -s /some/new/path linkname
새 심볼릭 링크를 생성하면
mv
변경됩니다(디렉터리의 경우에도 원자적으로).ln -s /some/new/path newlinkname mv -fT newlinkname linkname # linkname remains after the command