Как получить относительный путь между двумя каталогами?

Вы не можете использовать ExecStartPreдля прямой установки окружения для других команд ExecStartPreили ExecStart. -это все отдельные процессы. (Косвенно, сохраняя в файл и читая его или что-то в этом роде, конечно.)

В Systemd есть два способа установки окружения:Environment=и EnvironmentFile=. Примеры того и другого есть в man 5 systemd.exec. Они влияют на все процессы, запущенные службой, в том числе для ExecStartPre. Если эти переменные не должны устанавливаться динамически, это хороший вариант :

.

Environment=GUNICORN_SERVER=127.0.0.1:8080

Однако, если вам нужно динамически устанавливать переменные, в справочной странице говорится об этомEnvironmentFile:

The files listed with this directive will be read shortly before the process is
executed (more specifically, after all processes from a previous unit state
terminated. This means you can generate these files in one unit state, and read it
with this option in the next).

Таким образом, одним из вариантов было бы записать его в файл в ExecStartPreи заставить systemd прочитать этот файл как частьEnvironmentFile:

EnvironmentFile=/some/env/file
ExecStartPre=/bin/bash -c 'echo foo=bar > /some/env/file'
ExecStart=/some/command  # sees bar as value of $foo

Другим вариантом может быть использование оболочки вExecStart:

ExecStart=/bin/sh -c 'export GUNICORN_SERVER=127.0.0.1:8080; exec /usr/local/bin/gunicorn...'

1
15.03.2020, 18:07
2 ответа

Абсолютно не ясна цель этого, но это будет делать именно то, что просили, используя GNU realpath:

realpath -m --relative-to=release/linux/x86.
../../..
realpath -m --relative-to=release///./linux/./x86//.
../../..
5
28.04.2021, 23:20

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

Ожидаются два параметра, исходный -каталог и целевой -каталог, оба абсолютные канонизированные не -пустые пути, либо/-могут заканчиваться, ни нужно существовать. Возвращает результат в envar $REPLYкак относительный путь от исходного -каталога к целевому каталогу -без завершающих /, ., если недействительно.

Алгоритм взят из публикации comp.unix.shell 2005 года, которая сейчас на archive.org .

pnrelpath() {
    set -- "${1%/}/" "${2%/}/" ''               ## '/'-end to avoid mismatch
    while [ "$1" ] && [ "$2" = "${2#"$1"}" ]    ## reduce $1 to shared path
    do  set -- "${1%/?*/}/"  "$2" "../$3"       ## source/.. target../relpath
    done
    REPLY="${3}${2#"$1"}"                       ## build result
    # unless root chomp trailing '/', replace '' with '.'
    [ "${REPLY#/}" ] && REPLY="${REPLY%/}" || REPLY="${REPLY:-.}"
}

Использовать как

$ pnrelpath "$HOME" "$PWD"
projects/incubator/nspreon
$ pnrelpath "$PWD" "$gimpkdir"
../../../.config/GIMP
$ pnrelpath "$PWD" "$(cd "$dirnm" && pwd || false)"
# using cd to resolve, canonicalize ${dirnm}

или с URI s совместное использование scheme://authority,

$ pnrelpath 'https://example.com/questions/123456/how-to' 'https://example.com/media'
../../../media
1
25.06.2021, 15:26

Теги

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