В сценарии я получаю $0
возможный относительный путь к нему. Для преобразования в абсолют я нашел такое решение, которое не понимаю:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Моя проблема в магии внутри ${0%/*}
и ${0##*/}
. Похоже, что первый извлекает имя каталога, а второй извлекает имя файла, я просто не понимаю, как.
readlink -f $0
чтобы получить канонический путь.dirname
Util полезно здесь.BASH_SOURCE
что лучше, чем$0
, поскольку$0
дает набранную пользователем команду, которая может быть не выполняемым в данный момент скриптом.Ответы:
Определения:
${string%substring}
удаляет$substring
самое короткое совпадение с конца$string
.${string##substring}
удаляет самое длинное совпадение$substring
с начала$string
.Ваш пример:
${0%/*}
удаляет все после последней косой черты, давая вам имя каталога скрипта (который может быть относительным путем).${0##*/}
удаляет все до последней косой черты, давая вам только имя сценария.Таким образом, эта команда переходит в каталог скрипта и объединяет текущий рабочий каталог (заданный
$PWD
) и имя скрипта, указывающее абсолютный путь.Чтобы увидеть, что происходит, попробуйте:
источник
Шон имел самое простое решение:
readlink -f $0
. Если вы хотите быть абсолютно уверенным в обработке странных имен файлов, вы можете использовать это:Документация
источник
readlink -fn
это специфично для Linux, NetBSD и OpenBSD.Вот более безопасный и понятный способ сделать эту работу:
Заметки:
$0
это пустое имя файла без предшествующего пути, исходный скрипт потерпит неудачу, но приведенный здесь будет работать. (Не проблема,$0
но может быть в других приложениях.)$0
, но может быть в других приложениях.)unset
важно, если ваш пользователь могCDPATH
установить.readlink -f
илиrealpath
, это будет работать на не-Linux версиях Unix (например, Mac OS X).источник
Если вы хотите изучить Расширение параметров оболочки, вы можете прочитать его здесь , но Расширение не всегда является хорошим выбором. В этом случае почти каждая Unix-подобная система имеет 2 полезных утилиты:
Первый извлечет имя файла, а второй извлечет путь, поэтому, если у вас есть $ 0, скажите:
И вы получите путь.
ура
источник
Представляем pwd, встроенную в bash. Также находится в пакете GNU coreutils.
источник