/bin이 심볼릭 링크인데 왜 $0=/bin/foo입니까?

/bin이 심볼릭 링크인데 왜 $0=/bin/foo입니까?

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.shother-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)를 알려줄 것입니다.

에서맨 페이지:

주어진 이름의 모든 구성요소에 있는 모든 심볼릭 링크를 반복적으로 따라가며 정규화합니다. 마지막 구성 요소를 제외한 모든 구성 요소가 존재해야 합니다.

관련 정보