Дано два файла:
generic/scripts/hello.sh
parent/scripts -> generic/scripts
После вызова parent/scripts/hello.sh
из любого места, я хотел бы (в скрипте) найти полный путь к родительскому каталогу. В этом случае parent
.
Основная проблема заключается в том, что parent/scripts/..
относится к generic
в Unix. С другой стороны, все, что связано с регулярными выражениями, не является общим и может быть подвержено ошибкам.
Решения, которые не работают:
`dirname $0`/..
realpath `dirname $0`/..
readlink -f `dirname $0`/..
`cd *something*/..; pwd`
`perl ... abs_path(...)`
Все это будет указывать на generic
, а не parent
из-за символической ссылки.
Все, что включает в себя регулярные выражения, не может быть адаптировано / универсально, может не работать для более сложных путей. В пути могут быть и другие ..
и символические ссылки, вам нужен прародитель, это имя каталога, включающее ..
, вы вызываете его через $ PATH ...
Более того, я бы хотел, чтобы он работал в любом случае, даже если он вызывается через $PATH
.
Любое простое безопасное решение этой простой проблемы? Я имею в виду, что он просто получает родительский каталог!
Что я использовал:
dir=$( dirname $( cd `dirname $0` >/dev/null; pwd ) )
Не знаю, если он идеален, но, похоже, ведет себя как ожидалось.