"ln"과 "ln -s"의 일관되지 않은 동작

"ln"과 "ln -s"의 일관되지 않은 동작

우리 모두 알고 있듯이 이 ln명령은 링크를 생성하고 기본값은 하드 링크이며 옵션은 -s심볼릭 링크를 생성합니다. 일반적인 구문은 ln [-s] OLD NEWOLD가 연결하려는 파일이고 NEW가 생성하려는 새 파일입니다. 서로 내부의 폴더 사이에 하드 링크가 생성될 수 있기 때문에 디렉토리에 대한 하드 링크를 생성할 수 있는 방법이 없습니다. 컴퓨터에는 아직 심각한 속도 저하 없이 이를 확인할 수 있는 리소스가 없는 것 같습니다.

링크를 생성할 때 두 파일의 절대 경로 또는 상대 경로를 작성해야 합니다. 상대 및 절대 파일 경로를 혼합할 수 있습니다. 즉, 새 파일/폴더의 상대 경로와 이전 파일/폴더의 절대 경로를 혼합할 수 있습니다. 상대 경로를 사용하여 하드 링크를 생성하면 두 파일의 경로는 현재 폴더를 기준으로 하는 반면, 심볼릭 링크를 사용하면 링크된 파일/폴더의 경로는 상위 폴더를 기준으로 하지만 이전 파일/폴더의 경로는 폴더는 현재 폴더의 상대입니다. 이것이 내 질문과 "관련"된 이유는 무엇입니까?

/home/user예를 들어, HOME 폴더( 라고도 함) 에 ~폴더 2개를 만들고 파일 new이 폴더에 new2있다고 가정해 보겠습니다 . 시도하면 결과적으로 현재 존재하지 않는 링크에 대한 링크가 끊어 집니다 . 그러나 대신 실행하면 예상된 결과, 즉 from의 링크를 얻습니다.filenewln -s new/file new2/file~/new2/file~/new2/new/fileln -s ../new/file new2/file~/new2/file~/new/file

그래서 내 질문은 다음과 같습니다.

심볼릭 링크의 OLD 파일/폴더의 파일 경로는 상위 폴더를 기준으로 하고 다른 3개 경로(하드 링크 OLD, NEW 파일, 심볼릭 링크 NEW 파일/폴더)는 현재 폴더를 기준으로 하는 이유는 무엇입니까?

이 모든 작업은 Fedora에서 수행되었지만 대부분의 UNIX 기반 운영 체제에서도 작동할 것이라고 확신합니다.

편집하다E Carter Young은 내 두 번째 질문(그리고 내 첫 번째 질문은 어쨌든 틀렸음)으로 딱 맞는 것 같습니다. 심볼릭 링크의 경우 대상이 존재할 필요가 없으므로 시스템은 현재 디렉터리가 아닌 링크에 상대적인 경로를 만들어야 합니다. 그런데 사용자가 경로가 무엇인지 찾아 직접 입력하도록 강요하는 대신 명령을 실행할 때 쉘이 경로를 확인하지 않는 이유는 무엇입니까? 쉘이 잘 구문 분석되는 것 같습니다. 이것이 레거시 문제입니까? 성능 문제? 무엇?

답변1

맨 페이지를 읽으십시오. 질문 1 = 첫 번째 양식, 이는 Linux에서는 모든 항목, 심지어 디렉토리도 파일로 처리되기 때문입니다. 예를 들어, /etc/를 텍스트 편집기로 "열기"(예: nano -w /etc/ nano)는 /etc/가 디렉토리임을 정중하게 알려줍니다. 끝없는 기호 링크를 만드는 것이 기술적으로 합법적이기 때문입니다. 과거에는 범위 검사를 작성하기 전에 /etc라는 이름의 파일 2개(하나는 파일, 하나는 디렉토리)가 있는 FHS 시스템을 가질 수 있었고 시스템은 차이점을 알고 있었습니다.

(ㅋㅋㅋ댓글 보세요Chromiumos 개발자 가이드:

~/trunk에서 chroot를 다시 찾을 수 있으므로 파일 시스템 루프가 있습니다. 이것에 대해 너무 오랫동안 생각하지 마십시오. du -s ${HOME}/chromiumos/chroot/home을 사용하려고 하면 파일 시스템 손상에 대한 메시지가 나타날 수 있습니다. 이는 걱정할 필요가 없습니다. 단지 컴퓨터가 루프를 이해하지 못한다는 의미일 뿐입니다. (이 사이클을 이해할 수 있다면 더 어려운 것을 시도해보세요.

더 어려운 것을 클릭해 보세요 :) 루프를 방지하려면 ln에는 전체 경로가 필요합니다.

질문 2는 매뉴얼 페이지를 다시 읽고 마지막 문장을 보면 답할 수 있습니다.

설명하다

   In the 1st form, create a link to TARGET with the name LINK_NAME.  In
   the 2nd form, create a link to TARGET in the current directory.  In
   the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
   Create hard links by default, symbolic links with --symbolic.  By
   default, each destination (name of new link) should not already
   exist.  When creating hard links, each TARGET must exist.  Symbolic
   links can hold arbitrary text; if later resolved, a relative link is
   interpreted in relation to its parent directory.

답장: 편집:"그런데 사용자가 경로가 무엇인지 찾아 직접 입력하도록 강요하는 대신 명령을 실행할 때 쉘이 경로를 확인하지 못하는 이유는 무엇입니까?"


다음 예를 고려하십시오. 애플리케이션 A는 라이브러리 버전 1.0.a를 설치합니다. 라이브러리 A에 의존하는 애플리케이션 X, Y, Z를 빌드합니다. 애플리케이션 A는 버그를 찾아 업데이트하고 라이브러리를 1.0.1.2.a로 저장합니다. 응용 프로그램 이후

ln -s /usr/lib64/libfoo-1.0.1.2.a /usr/lib64/libfoo-1.0.a

응용 프로그램 X, Y 및 Z도 적용된 라이브러리에서 새로운 버그 수정을 받습니다. 셸은 1.0에서 1.0.1.2까지의 링크를 따르지만 이를 1.0이라고 부르기 때문입니다. 이 경우 시스템 전체 손상 가능성이 높아지므로 쉘이 해당 경로를 가정하는 것을 원하지 않습니다. 그런데 64비트 시스템의 /usr/lib는 /usr/lib64에 연결되어 방금 제공한 대규모 예제를 수정합니다. 여기서 32비트 응용 프로그램에서는 라이브러리가 /usr/lib에 설치될 것으로 예상하지만 64비트 시스템에 순수한 32비트 라이브러리가 없으므로 /usr/lib는 다음과 같이 /usr/lib64에 연결됩니다.

ln -s /usr/lib64 /usr/lib

답변2

질문 1: 소프트 링크는 두 파일/폴더의 전체 경로를 작성해야 하는 반면, 하드 링크는 대상 파일의 파일 이름을 생략할 수 있는 이유는 무엇입니까?

또한 대상이 현재 디렉터리에 있지 않으면 소프트 링크의 경로나 파일 이름을 지정할 필요가 없습니다. 예를 들어 파일이 있는 경우 ~/Downloads/target_file다음을 수행할 수 있습니다.

ln `~/Downloads/target_file`

이것은 당신이 할 때 ~/생성됩니다하드 링크파일 이름을 추가하세요. 이렇게 할 수도 있습니다 ~/Downloads/target_file.~/target_file

ln -s `~/Downloads/target_file`

이것은 당신이 할 때 ~/생성됩니다소프트 링크파일명과 ~/Downloads/target_file함께 입력하세요 .~/target_file

질문 2: 소프트 링크 OLD 파일/폴더의 파일 경로는 상위 항목에 상대적인 반면 다른 3개 경로(하드 링크 OLD, NEW 파일, 소프트 링크 NEW 파일/폴더)는 다음에 의해 고정된 파일/파일에 상대적인 이유는 무엇입니까? 그들 자신?

네 가지 경로는 모두 상대(현재 폴더 기준)일 수도 있고 절대일 수도 있습니다. 유일한 기준은 이름이나 경로를 지정하지 않으면 하드 링크나 소프트 링크가 동일한 폴더에 있어서는 안 된다는 것입니다.

너는 읽어야 해매뉴얼 페이지에서. Ubuntu 14.04에서 이 모든 것을 시도했지만 여전히 매뉴얼 페이지를 통해 확인되었으므로 OS에 국한되지 않고 걱정할 필요가 없습니다.

답변3

하드 링크를 생성할 때 링크 생성 시 소스 경로가 사용되므로 현재 작업 디렉터리에 대한 상대 경로(또는 절대 경로)여야 합니다. 심볼릭 링크를 생성할 때 소스 경로는 문자열로 처리됩니다. 링크가 사용되면 링크가 위치한 디렉터리를 기준으로 해석됩니다.

귀하의 예를 고려하면 현재 디렉토리는 입니다 /home/user.

  • 이 명령은 ln -s new/file new2/file텍스트가 포함된 심볼릭 링크를 생성 new/file하고 해당 링크를 위치에 배치합니다 new2/file. 프로그램이 링크에 액세스하면 대상이 /home/user/new2/new/file존재하지 않습니다.
  • 이 명령은 ln -s ../new/file new2/file텍스트가 포함된 심볼릭 링크를 생성 ../new/file하고 해당 링크를 위치에 배치합니다 new2/file. 프로그램이 링크에 액세스하면 대상은 /home/user/new2/../new/file로 축약 됩니다 /home/user/new/file.
  • 이 명령은 동일한 파일(반드시 존재해야 함)을 가리키는 ln new/file new2/file디렉토리 항목을 생성합니다 .new2/file/home/user/new/file

일반적으로 심볼릭 링크를 만들기 전에 대상 디렉터리로 변경하는 것이 덜 혼란스럽습니다.

cd new2
ln -s ../new/file .

관련 정보