Несколько ответов здесь упоминают порт Behlendorf ZFS.
Следует иметь в виду, что порт Behlendorf ZFS в настоящее время предназначается к пользователям Блеска с чрезвычайно большими файловыми системами. Это - то, в чем нуждаются Lawrence Livermore National Labs, американское Министерство энергетики и другие экспериментальные установки, потому что они выполняют очень большие файловые системы (100 ТБ - системы мультипетабайта в ближайшем будущем). Блеск работает на Linux и сталкивается с проблемами при использовании для файловых систем выше определенных размеров. Некоторые люди надеются решить эту проблему с помощью ZFS, который является, где zfsonlinux.org начинает действовать.
Для ZFS, чтобы быть полезным для остальной части нас, ZPL (ZFS Слой POSIX) должен быть портирован к Linux, так, чтобы администраторы могли взаимодействовать с файловой системой. zfsonlinux.org имеет версию разработки ZPL, и KQ Infotech обеспечивает другую реализацию ZPL, который является ветвлением кода zfsonlinux.org.
Белендорф хочет, чтобы справка улучшила ZPL и объединилась в любых изменениях от KQ Infotech в репозиторий zfsonlinux.org. Если можно сделать это, сообщество извлечет выгоду значительно, и Вы будете рок-звездой.
Определения:
${string%substring}
удаляет самое короткое соответствие $substring
от конца $string
.
${string##substring}
удаляет самое долгое соответствие $substring
от запуска $string
.
Ваш пример:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
${0%/*}
удаляет все после последней наклонной черты, давая Вам имя каталога сценария (который мог бы быть относительным путем).
${0##*/}
удаляет все до последней наклонной черты, давая Вам просто название сценария.
Так, эта команда изменяется на каталог сценария и связывает текущий рабочий каталог (данный $PWD
) и название сценария, дающего Вам полный путь.
Для наблюдения, что идет на попытку:
echo ${0%/*}
echo ${0##*/}
У Shawn было простое решение: readlink -f $0
. Если Вы хотите абсолютно убедиться обработать странные имена файлов, можно использовать это:
absolute_path_x="$(readlink -fn -- "$0"; echo x)"
absolute_path="${absolute_path_x%x}"
readlink -fn
характерно для Linux, NetBSD и OpenBSD.
– Gilles 'SO- stop being evil'
18.03.2011, 22:41
Если Вы хотите изучить Расширение Параметра Shell, можно считать его отсюда, но Расширение является не всегда хорошим выбором. В этом случае почти каждый Unix как система имеет 2 хороших utils:
basename
dirname
Первое извлечет имя файла, в то время как второе извлечет путь, таким образом, если у Вас есть 0$, скажите:
dirname $0
И you'ill получают путь.
Удачи
Вот более безопасное и больше читаемого способа сделать это задание:
abspath=$(unset CDPATH && cd "$(dirname "$0")" && echo $PWD/$(basename "$0"))
Примечания:
$0
пустое имя файла без предыдущего пути, исходный сценарий перестанет работать, но один данный здесь будет работать. (Не проблема с $0
но мог быть в других приложениях.) $0
, но мог быть в других приложениях.)unset
важно, если Ваш пользователь может иметь CDPATH
набор. readlink -f
или realpath
, это будет работать над версиями не-Linux Unix (например, Mac OS X). Представляя pwd, встроенный удар. Также найденный в GNU coreutils пакет.
$ sh ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh
$0: ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh
cheeky binary from /home/jaroslav/tmp (/home/jaroslav/tmp)
$ cat /home/jaroslav/tmp/somewhere.sh
abs=$( cd `dirname "$0"` ; pwd -P)
absBin=$( cd `dirname "$0"` ; /bin/pwd -P)
echo \$0: $0
echo cheeky binary from $abs \($absBin\)