![bash가 디렉토리와 다르게 심볼릭 링크를 완성하는 이유는 무엇입니까?](https://linux55.com/image/2154/bash%EA%B0%80%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%99%80%20%EB%8B%A4%EB%A5%B4%EA%B2%8C%20%EC%8B%AC%EB%B3%BC%EB%A6%AD%20%EB%A7%81%ED%81%AC%EB%A5%BC%20%EC%99%84%EC%84%B1%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 소스코드를 검색할 때 주로 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'