
bash 스크립트를 설치 /usr/bin/app.sh
하고/usr/bin/lib.sh
app.sh
포함
source "/usr/bin/lib.sh"
그리고 lib.sh
다음을 포함합니다
if [ "/usr/bin/app.sh" == "$0"] ...
app.sh
셸에서 실행하면 $0
실제로 이기 때문에 이 테스트가 실패합니다 /bin/app.sh
. 파일 시스템에는 /bin
다음에 대한 심볼릭 링크가 있습니다./usr/bin
환경에 속지 않는 방식으로 에 포함 lib.sh
되었는지 여부를 확인하는 가장 좋은 방법은 무엇입니까 ? 나는 심볼릭 링크가 없는 절대 경로가 그 일을 해냈을 것이라고 생각했지만 분명히 그렇지 않았습니다.app.sh
other-app.sh
답변1
두 파일이 동일한지 확인하려면 다음과 같이 표시되는 인덱스(inode) 번호를 확인해야 합니다.
stat -L -c %i FilePath
이제 귀하의 수표는 다음과 같습니다.
if [ $(stat -L -c %i "/usr/bin/app.sh") == $(stat -L -c %i "$0") ] ...
이는 디렉토리 경로의 링크나 파일 자체에 대한 기호 링크 또는 하드 링크와 관계없이 작동합니다.
엄밀히 말하면(이 점을 지적한 @ilkkachu에게 감사드립니다) 동일한 이름을 가진 두 개의 다른 파일이 두 개의 다른 파일 시스템에서 동일한 inode를 가질 가능성은 거의 없습니다. 이를 방지하려면 비교에 장치 번호를 포함하십시오.
if [ $(stat -L -c %d:%i "/usr/bin/app.sh") == $(stat -L -c %d:%i "$0") ] ...
답변2
readlink -f /path/to/whatever
표준 경로(귀하의 예에 있음 /usr/bin/app.sh
)를 알려줄 것입니다.
에서맨 페이지:
주어진 이름의 모든 구성요소에 있는 모든 심볼릭 링크를 반복적으로 따라가며 정규화합니다. 마지막 구성 요소를 제외한 모든 구성 요소가 존재해야 합니다.