1

Я установил свои 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) таким образом, чтобы его не обмануло окружение? Я бы подумал, что абсолютные пути без символических ссылок сделали бы эту работу, но, видимо, нет.

2 ответа2

3

readlink -f /path/to/whatever what скажет вам канонический путь (который в вашем примере будет /usr/bin/app.sh ).

Со страницы руководства:

канонизировать, рекурсивно следуя каждой символической ссылке в каждом компоненте данного имени; все, кроме последнего компонента должны существовать

2

Чтобы проверить, совпадают ли два файла, необходимо проверить номер индекса (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") ] ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .