readlink -f
было бы лучше, если бы он был переносимым, поскольку он разрешает все ссылки, найденные как для каталогов, так и для файлов.
В Mac OS X нет readlink -f
(кроме, может быть, через macports), поэтому вы можете использовать readlink
только для получения места назначения конкретного файла символьной ссылки.
Техника $(cd -P ... pwd -P)
хороша, но работает только для разрешения ссылок на каталоги, ведущие к скрипту, она не работает, если сам скрипт является символической ссылкой
Также один случай, который не был упомянут: когда вы запускаете скрипт, передавая его в качестве аргумента в оболочку (/bin/sh /path/to/myscript.sh
), $0
в этом случае не может использоваться
Я взглянул на mysql "binaries", многие из них на самом деле являются скриптами оболочки; и теперь я понимаю, почему они запрашивают опцию --basedir
или должны запускаться из определенного рабочего каталога; это потому, что не существует хорошего решения, чтобы найти целевой скрипт