Найдите полный путь из сценария

Несколько ответов здесь упоминают порт 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. Если можно сделать это, сообщество извлечет выгоду значительно, и Вы будете рок-звездой.

10
18.03.2011, 15:00
5 ответов

Определения:

${string%substring} удаляет самое короткое соответствие $substring от конца $string.

${string##substring} удаляет самое долгое соответствие $substring от запуска $string.

Ваш пример:

abspath=$(cd ${0%/*} && echo $PWD/${0##*/})

${0%/*} удаляет все после последней наклонной черты, давая Вам имя каталога сценария (который мог бы быть относительным путем).

${0##*/} удаляет все до последней наклонной черты, давая Вам просто название сценария.

Так, эта команда изменяется на каталог сценария и связывает текущий рабочий каталог (данный $PWD) и название сценария, дающего Вам полный путь.

Для наблюдения, что идет на попытку:

echo ${0%/*}
echo ${0##*/}
8
27.01.2020, 20:00
  • 1
    Добавьте двойные кавычки вокруг всех переменных расширений для преодоления (почти всех) имен файлов, содержащих специальные символы оболочки. –  Gilles 'SO- stop being evil' 18.03.2011, 22:42

У Shawn было простое решение: readlink -f $0. Если Вы хотите абсолютно убедиться обработать странные имена файлов, можно использовать это:

absolute_path_x="$(readlink -fn -- "$0"; echo x)"
absolute_path="${absolute_path_x%x}"

Документация

10
27.01.2020, 20:00
  • 1
    Хороший для наблюдения заключительных новых строк, правильно обработанных. К сожалению, 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 получают путь.

Удачи

2
27.01.2020, 20:00
  • 1
    dirname может возвратить относительные пути –  opticyclic 19.04.2013, 00:02

Вот более безопасное и больше читаемого способа сделать это задание:

abspath=$(unset CDPATH && cd "$(dirname "$0")" && echo $PWD/$(basename "$0"))

Примечания:

  • Если $0 пустое имя файла без предыдущего пути, исходный сценарий перестанет работать, но один данный здесь будет работать. (Не проблема с $0 но мог быть в других приложениях.)
  • Любой подход перестанет работать, если путь к файлу не будет на самом деле существовать. (Не проблема с $0, но мог быть в других приложениях.)
  • unset важно, если Ваш пользователь может иметь CDPATH набор.
  • В отличие от этого, readlink -f или realpath, это будет работать над версиями не-Linux Unix (например, Mac OS X).
4
27.01.2020, 20:00

Представляя 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\)
0
27.01.2020, 20:00

Теги

Похожие вопросы