Старе питання, але є набагато простіший спосіб, якщо ви маєте справу з повними іменами шляху на рівні оболонки:
abspath = "$ (cd" $ path "&& pwd)"
Оскільки компакт-диск трапляється в нижній частині, він не впливає на основний сценарій.
Дві варіанти, припускаючи, що ваші вбудовані команди оболонки приймають -L та -P, це:
abspath = "$ (cd -P" $ path "&& pwd -P)" #фізичний шлях з вирішеними символьними посиланнями
abspath = "$ (cd -L" $ path "&& pwd -L)" #логічний шлях із збереженням посилань
Особисто мені рідко потрібен такий пізніший підхід, якщо я чомусь не захоплююсь символічними посиланнями.
FYI: варіація отримання початкового каталогу скрипту, який працює навіть у тому випадку, якщо сценарій згодом змінює поточний каталог.
name0 = "$ (базове ім'я" $ 0 ")"; # base ім'я сценарію
dir0 = "$ (cd" $ (dirname "$ 0") "&& pwd)"; #absolute стартовий реж
Використання CD запевняє, що у вас завжди є абсолютна директорія, навіть якщо сценарій працює за допомогою таких команд, як ./script.sh, який без cd / pwd часто дає просто .. Марно, якщо пізніше сценарій має компакт-диск.
/foo/bar
чи/foo
існує насправді, або вас цікавить лише аспект маніпулювання рядками відповідно до правил імені шляху?