bash가 디렉토리와 다르게 심볼릭 링크를 완성하는 이유는 무엇입니까?

bash가 디렉토리와 다르게 심볼릭 링크를 완성하는 이유는 무엇입니까?

저는 소스코드를 검색할 때 주로 find환경변수를 경로로 사용합니다. 최근에 환경 변수를 심볼릭 링크로 대체했는데 이로 인해 Bash의 셸 완성이 중단되었습니다. 심볼릭 링크를 사용 하면 find작동하지 않지만 심볼릭 링크가 가리키는 실제 경로를 사용하면 찾을 수 있습니다.

ln -s /some/source/dir /the/source
export SYMLINK=/the/source
export DIR=/some/source/dir

find $SYMLINK -name file.c        // doesn't find anything
find $DIR -name file.c            // works as expected

이 예에서 $SYMLINK는 $DIR 값에 대한 기호 링크입니다.

그렇다면 Bash가 Symlink 환경 변수를 다르게 처리하는 이유는 무엇입니까?

답변1

이것은 bash가 아니며 find입니다. 대부분의 유틸리티가 동일한 원칙을 따른다는 것을 알 수 있습니다.

  • 파일 내용에 대해 작업을 수행하는 경우 일반 파일에 대한 심볼릭 링크는 실제 파일과 동일합니다.
  • 디렉토리 항목에 대해 작업을 수행하는 경우 기호 링크는 자체 범주입니다.

이를 실행하면 find $SYMLINK디렉터리 find가 아닌 개체가 표시되므로 디렉터리를 탐색하지 않습니다. 디렉토리에 대한 심볼릭 링크를 해당 디렉토리로 취급하려면 /끝에 를 추가하십시오(일부 손상된 시스템이나 명령에는 이 가 필요할 수 있습니다 "$SYMLINK/.").

find "$SYMLINK/" -name file.c

의 경우 대상을 지정한 것처럼 명령줄에서 모든 심볼릭 링크를 처리하도록 지시하는 find이 옵션을 사용할 수도 있습니다 .-H

find -H "$SYMLINK" -name file.c

답변2

bash그렇지 않습니다 find. 재귀 디렉터리 순회에서 심볼릭 링크를 따라가면 종종 무한 루프가 발생합니다( ln -s foo .호환성 경로를 제공하는 일반적인 방법을 고려하세요). POSIX 에는 이를 재정의하는 조건자가 find포함되어 있습니다 -follow. 아마도 이 경우에 더 유용할 것입니다. GNU find는 -H탐색 중에 발견된 심볼릭 링크 확장을 계속 피하면서 인수로 직접 지정된 심볼릭 링크만 추적합니다. 별칭과 함께 사용할 수 있습니다.

alias find='find -H'

관련 정보