심볼릭 링크 폴더에서 심볼릭 링크 식별

심볼릭 링크 폴더에서 심볼릭 링크 식별

내가 심볼릭 링크된(소프트) 폴더의 하위 폴더(또는 손자 등)인 콘솔의 하위 폴더에 있다고 가정해 보겠습니다.

하위 폴더에서 ls -la아무것도 하지 않으면 모든 파일이 Symlink 폴더 안에 있다는 것이 표시됩니다.

내가 어떻게 알아? 현재 이를 확인하려면 상위 폴더로 이동해야 합니다.

그러나 이는 오류 조회를 테스트하여 상위(링크)에 도달할 때까지 모든 폴더 계층 구조를 테스트하는 것을 의미합니다.

답변1

일부 심볼릭 링크를 통해 현재 작업 디렉터리로 이동했다는 사실은 셸(예: Bash)에서만 추적됩니다. 여기로 이동한 경로를 논리 경로라고 하며 실제로 디렉터리에 대한 기호 링크인 디렉터리 구성 요소를 포함할 수 있습니다. 모든 심볼릭 링크가 해결된 후의 경로를 물리적 경로라고 합니다.

현재 Bash나 내장 도구가 아닌 도구로, 쉘의 현재 작업 디렉터리에서 별도의 프로세스로 생성되면 물리적 경로가 운영 디렉터리이기 때문에 자연스럽게 해당 디렉터리에 대한 물리적 경로를 알게 됩니다. 프로세스와 관련된 시스템 경로( /proc/self/cwd프로세스의 경우). 도구는 PWD해당 환경에서 변수를 검사하거나 변수를 검사하는 도구를 사용하여 논리적 경로에 대해 알아볼 수 있습니다. 변수의 값은 Bash에서 가져옵니다.

cdBash에서 내장 함수는 pwd물리적 또는 논리적 경로에서 작동할 수 있습니다.이 답변. pwd이는 내장된 것이 아니며(예 : ) 해당 환경의 변수를 /usr/bin/pwd확인하기 때문에 논리적 경로만 알려줄 수 있습니다 . PWDSymlink 디렉토리에서 다음을 비교하십시오.

$ env pwd -L
/logical/path
$ env pwd -P
/physical/path
$ env --unset=PWD pwd -L
/physical/path

pwd이 중 어느 것도 내장되어 있지 않습니다. 자체적 env으로 내장된 쉘이 아니며 pwd내장된 것이 아닌 실행 파일만 실행할 수 있습니다. PWD환경에서 이를 제거 함으로써 pwd -L동작이 pwd -P.

lsPWD환경 에는 관심이 없습니다 . 물리적 경로와 논리적 경로 사이에 발생할 수 있는 차이점은 수행되는 작업과 아무 관련이 없습니다 ls. 달라야 한다고 생각할 수도 있습니다. 질문의 첫 번째 버전에서는 심볼릭 링크 디렉터리의 모든 파일이 심볼릭 링크라고 잘못 가정했습니다. 이 가정을 사용하면 ls이 사실을 숨기는 추가 가정을 하기가 쉽습니다 . 실제로 ls일부 (물리적) 디렉터리에서는 쉘을 해당 디렉터리로 연결하는 논리적 경로가 모두 동일한 방식으로 작동합니다.

pwd -P의 출력을 의 출력과 비교(또는 직접 AND 연산)하여 pwd -L물리적 경로와 논리적 경로 간의 차이를 감지 할 수 있습니다 $PWD. 기본적인 경고를 작성해 봅시다 ls:

function ls (
   p="$(pwd -P)"
   command ls "$@"
   [ "$p" != "$PWD" ] && >&2 printf 'ls: warning: ./ -> %s/\n' "$p"
)

별칭 대신 함수를 사용했는데, 그 이유는 alias ls='ls --color=auto'그것이 일반적이고 그것을 깨뜨리고 싶지 않았기 때문입니다.여기에는 별칭이 적용되지 않습니다.. 별칭이 존재할 가능성이 높으므로 구문이 function ls …이식 가능한 것보다 더 좋습니다 ls () …(후자는 별칭을 트리거합니다).

이 기본 기능은 완벽하지 않습니다. ls /some/other/dirNever warnings /some/other/dir, 경고합니다 ./(심볼릭 링크된 경우). 하지만 ./이 경우에는 중요하지 않습니다.

어쨌든, "내가 있는 하위 디렉터리가 심볼릭 링크 디렉터리의 (손자...) 하위 디렉터리인지 어떻게 알 수 있나요?"에 대한 대답은 다음과 같습니다. 예:

[ "$(pwd -P)" != "$PWD" ]

답변2

내 bash 프롬프트에 추가하면 $(pwd -P)심볼릭 링크 이름이 아닌 실제 폴더 이름이 제공됩니다. ls내가 아는 한, 원하는 것을 제공하는 명령 스위치는 없습니다. 그러나 적어도 변경 프롬프트를 통해 현재 위치를 정확히 알 수 있습니다.

답변3

@ajgringo619를 기반으로 함

이것이 해결되었습니다:

# includes complete left path
alias ll2='if [[ $(diff <(ls "$PWD" | sed "s|.*|$(ls -d "$PWD/")&|g") <(ls -d "$(pwd -P)/"*) | wc -l) == "0" ]]; then ls -l; else paste -d " -> " <(ls "$PWD" | sed "s|.*|$(ls -d "$PWD/")&|g") /dev/null /dev/null /dev/null <(ls -d "$(pwd -P)/"*); fi'

# or 

alias ls2='if [[ $(diff <(ls "$PWD" | sed "s|.*|$(ls -d "$PWD/")&|g") <(ls -d "$(pwd -P)/"*) | wc -l) == "0" ]]; then ls -l; else paste -d " -> " <(ls "$PWD") /dev/null /dev/null /dev/null <(ls -d "$(pwd -P)/"*); fi'

관련 정보