"ls -L"이 링크가 가리키는 파일 이름이 아닌 링크 자체의 이름을 인쇄하는 이유는 무엇입니까?

"ls -L"이 링크가 가리키는 파일 이름이 아닌 링크 자체의 이름을 인쇄하는 이유는 무엇입니까?

소프트 링크의 "긴" 목록을 실행할 때 ls -l소프트 링크의 파일 속성을 표시합니다. ls -lL(또는 )을 실행하면 ls -l --dereference파일 속성은 링크가 가리키는 파일의 속성이 되지만 ls링크 자체의 이름은 계속 출력됩니다. 페이지 man에는 이에 대해 아무 것도 언급되어 있지 않습니다. 페이지에는 info이유 를 설명하지 않고 ls" ls링크가 가리키는 파일 이름이 아니라 링크 자체의 이름이 여전히 인쇄됩니다."라고만 표시됩니다. 나는 이것이 고의적인 선택이라고 생각하지만, 이 행동의 근거를 아는 사람이 있습니까 ls -L?

답변1

링크의 다른 쪽 끝에 있는 파일 이름은 귀하가 사용하는 이름이 아니거나 아닐 수도 있기 때문입니다 ls.

링크 자체의 이름 대신 기호 링크 대상의 이름을 표시하는 데에는 두 가지 문제가 있습니다.

  1. 파일이 존재하지 않습니다. 디렉토리 목록에 심볼릭 링크의 대상 이름이 나타나면 해당 디렉토리에 있는 파일 이름이라고 생각할 수 있지만 그렇지 않습니다. 대상의 이름은 해당 디렉터리에 있는 파일에 액세스하는 데 사용하는 이름이 아닙니다. 해당 파일 이름을 가진 파일이 (해당 디렉터리에) 존재하지 않거나 최악의 경우 해당 이름으로 액세스할 때 완전히 다를 수 있습니다. 파일(또는 디렉토리 등).

  2. 파일 이름이 동일한 것으로 나타날 수 있습니다. 심볼릭 링크의 대상 이름이 표시되면 해당 디렉터리의 다른 파일 이름과 동일하다는 것을 알 수 있지만 Unix 시스템에서는 불가능합니다.

ls이러한 경우 목록의 유효성을 검사하기 위해 없이 사용해야 하는 사용자에게 혼란을 초래하여 -L해당 옵션이 의미가 없게 됩니다 -L.

이것(아니요대상 이름 표시)도 POSIX에 지정된 동작이며 매우 명확합니다.

모든 기호 링크(명령줄에서 이름이 지정되었거나 파일 계층에서 발견되었는지 여부)의 파일 정보 및 파일 유형을 평가하여 링크 자체가 아닌 링크에서 참조하는 파일의 기호 링크가 되도록 합니다.단, ls링크가 참조하는 파일이 아닌 링크 자체의 이름을 적어야 합니다.. -L와 함께 사용 하면 -l기호 링크의 내용을 긴 형식으로 작성합니다(STDOUT 섹션 참조).

이는 근거 섹션에서 더 이상 논의되지 않습니다.POSIX ls매뉴얼.

답변2

-L또는 옵션을 사용할 때 심볼릭 링크가 계속 표시되는 이유는 링크된 파일의 이름이 아니라 링크의 이름 때문입니다 -H.

기호 링크와 하드 링크 사이의 주목할만한 차이점 중 하나는 기호 링크의 권한이 로 나열되면 ls -l거의 사용되지 않으며(첫 글자 제외 s) 파일 이름은 링크 이름과 경로 이름을 표시하는 규칙을 사용한다는 것입니다. 연결 symlink -> target. 이 동작의 이론적 근거는 ls -l대상이 존재하는지 여부에 관계없이 명령이 작동한다는 것입니다. 그 목적은 기호 링크 자체에 대한 정보를 제공하는 것입니다.

-L옵션은 하드 링크에서 발생하는 것과 유사한 동작을 허용하기 위해 추가되었습니다. 파일 권한은 실제 권한, 즉 기본 inode의 권한이며, 파일 이름은 쿼리되는 권한이지 다른 것이 아닙니다. 예를 들어, 실행하고 ls -lL a*an으로 시작하지 않는 파일 이름을 표시하면 혼란스러울 수 있습니다. a또한 대상 링크가 없으면 기본 inode가 없으므로 권한이 표시되지 않으며 명령이 ls -lL오류와 함께 실패합니다.

이것이 수행되는 또 다른 좋은 이유는 심볼릭 링크가 일반적으로 개별 파일 이름이 아닌 상대 또는 절대 경로와 연결되어 있지만 상대 또는 전체 경로를 표시하는 용도는 제공되지 않고 ls -l일반 파일 이름 또는 점 슬래시 없이만 제공된다는 것입니다.

관련 정보