심볼릭 링크는 원자 적으로 수정해야합니다. 중간에 글을 쓰면 작동하지 않습니다. 심볼릭 링크의 내용은 매우 작기 때문에 (리눅스에서 최대 4095 자 : 파일 경로의 최대 길이) 커널 수준에서 심볼릭 링크의 일부를 편집하는 데 별다른 의미가 없습니다. 따라서 커널은 심볼릭 링크를 편집하기위한 인터페이스를 제공하지 않으며, 새로운 링크를 생성하기위한 인터페이스, symlink
시스템 호출 ( unlink
파일을 제거 하는 일반 인터페이스 ) 만 제공합니다.
symlink
시스템 호출은 새로운 심볼릭 링크를 생성, 그것은 기존의 파일을 제거하지 않습니다. 이것은 성가신 일이지만 open
(새 파일을 만들거나 기존 파일을자를 수는 있지만 기존 파일을 새로 만든 파일로 대체 할 수는 없음) 및과 같은 파일을 만들기위한 다른 시스템 호출과 일치 합니다 mkdir
.
쉘에서 발견 한 것처럼 기호 링크를 ln
명령 으로 원자 적으로 바꿀 수는 없지만 ( ln -sf
이전 파일의 링크를 해제 한 다음 기호 링크를 작성 함) 먼저 임시 이름으로 기호 링크를 작성하여이를 수행 할 수 있습니다. 그런 다음 제자리로 옮기십시오.
tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"