Подтвердить что ты не робот

Как расширить относительные пути в оболочке script

Я пишу script для установки переменных среды в Linux 2.6 с помощью bash. Таким образом, script содержит команды вроде:

export SRC_DIR=..
export LIBPATH=${SRC_DIR}/lib

проблема в том, что, когда я пытаюсь выполнить echo $LIBPATH, он показывает "../lib", а не расширяет SRC_DIR до полного пути. Мне бы очень хотелось, чтобы script напечатал что-то вроде /home/x/lib, а не.. /lib.

UPDATE script должен оценивать SRC_DIR как один каталог вверх из script, а не в текущий каталог, из которого вызывается script

4b9b3361

Ответ 1

Изменить каталог в подзаголовке

Вот небольшой трюк, который вы можете использовать, чтобы получить абсолютный путь от относительного пути, не меняя текущий рабочий каталог. Трюк состоит в том, чтобы перейти к относительному пути в подоболочке, а затем расширить рабочий каталог. Например:

export SRC_DIR=$(cd ..; pwd)

Относительные пути из Script Вместо справочника вызовов

Чтобы перейти к относительному пути из местоположения Script, а не к текущему рабочему каталогу, вы можете использовать расширение параметра или служебную программу dirname. Я предпочитаю dirname, так как он немного более явный. Вот примеры.

# Using /usr/bin/dirname.
export SRC_DIR=$(cd "$(dirname "$0")/.."; pwd)

# Using the "remove matching suffix pattern" parameter expansion.
export SRC_DIR=$(cd "${0%/*}/.."; pwd)

Ответ 2

Команда readlink способна не только разрешать символические ссылки, но также канонизировать относительные пути. Будьте осторожны, так как вам может не нравиться поведение решения символических ссылок во всех ваших сценариях. Если вы не хотите разрешать символические ссылки, pwd будет лучшим; обратите внимание на использование подоболочки, поэтому команда cd не влияет на рабочий каталог в основной оболочке.

# The path you want to get information on... (for readability)
your_path=..

# Using /bin/readlink (resolves symlinks)
export SRC_DIR=$(readlink --canonicalize $your_path)

# Using /usr/bin/dirname (keeps symlinks)
export SRC_DIR=$(cd $your_path ; pwd)

Ответ 3

Я обычно использую

SCRIPT_DIR=$(readlink -f ${0%/*})

Он должен вернуть полный путь к script и даже разрешить все ссылки на этом пути.

Ответ 4

Сделайте это вместо:

export SRC_DIR=`pwd`;

Update:

Поскольку вам нужен путь относительно местоположения script в файловой системе, используйте вместо этого:

export SRC_DIR=`dirname $0`

Update2:

Ваш script должен быть вызван напрямую, а не как bash /path/to/script.sh или source foo.sh. Добавьте строку shebang, добавьте разрешения на выполнение и вызовите script напрямую.

Ответ 5

Когда я делаю это, я использую эхо так:

export SRC_DIR=`echo $HOME/bin/`

Ответ 6

Для хранения кода ошибки:

function getPwd() {
    $(cd $1; [[ $? -ne 0 ]] && exit 1 || echo echo $PWD;)
    return $?
}

Ответ 7

Выкопав эту старую ветку, чтобы добавить то, что я нашел, чтобы работать хорошо:

export SRC_DIR = 'realpath..'

см. больше информации здесь:

http://man7.org/linux/man-pages/man3/realpath.3.html