"direnv export bash": сгенерированная переменная получает знак доллара $ в начале без причины?

В моем сценарии после того, как я cdвнутри папки я проверяю, есть ли direnv команда доступна в системе и если .envrcфайл уже создан. Если это так, я создаю виртуальную среду Python с помощью:

direnv allow
eval "$(direnv export bash)"

По некоторым причинам VIRTUAL_ENVзначение переменной получает знак доллара впереди, и я не могу управлять им, как хочу впоследствии. Вот полная функция, которая это делает.

python_venv_binary() {
    if [ `command -v direnv &>/dev/null;` ] && [ -f ".envrc" ]; then
        direnv allow
        eval "$(direnv export bash)"
        echo $VIRTUAL_ENV
        # prints $/home/whatever/whatever/whatever/.direnv/python-3.8.5
        $VIRTUAL_ENV/bin/python
    fi
}

python_venv_binary
# $/home/whatever/whatever/whatever/.direnv/python-3.8.5/bin/python: not found

Я запускаю сценарий как sh script.sh. Что странно, так это то, что выполнение тех же команд вручную ведет себя правильно.

С участием set -xвот результат (я опубликовал то, что, на мой взгляд, имеет отношение к делу). Как ни странно, экспорт получает все $ впереди, что указывает на проблему.

+ command -v direnv
+ [ /usr/bin/direnv ]
+ [ -f .envrc ]
+ direnv allow
+ direnv export bash
direnv: loading ~/Development/kitty/.envrc
direnv: export +VIRTUAL_ENV ~PATH
+ eval export DIRENV_DIR=$'-/home/bernardo/Development/kitty';export VIRTUAL_ENV=$'/home/bernardo/Development/kitty/.direnv/python-3.8.5';export DIRENV_DIFF=$'eJzs1k1vmzAYB_Dv4nMSorgJBGkHHNIApSEJL-24IEKcQDCGGIe8VPnuU9utndLtsmmHqb7hx_7_hCxLz_MEKqA-gZnmGUAFUloWWFpiRmO2KqUOKZOYSMuMqlc7L6V9zaS3E1IRs03JoxRjEiUku04IS1jCEpawhPU31nuw_gi9Lt83Xj5el2-1TVzg-ufc90JN4-r5FLi0AH3uibq5GE-DSDcXQAXtq1_ScYNJWRWYcinPOD-B1o_Ag-aNjLELVICtY_dc3zqprs3RHsHBY3GeywmfnynrJq6seEhfH-6O_u39Li7PjUy73mNbt4eRtaU7n4dbt0u0Xr6zGz9wNsiCVh_KGsSEL9uDr2zIpk6_uMNuwRjazuKmmSG0bxsZpMpDOewVthHo0RFHxGn2_skdBFm-4VZch0ruhKvZJHPze5NAYxRM0GrUd9e8H_IULRNrelMfUBbCYDAZIMPlrDYrhzhrOegpwxRuIW66tqbpUXQ63HiO-QW0fjNEfLgpqbPKGKaNVJ14WtI27Cid_q8eyv_wHIUlLGEJS1ifw_r340cLBObC8zU7Gk-DP22n4HL5FgAA___9FMRg';export DIRENV_WATCHES=$'eJx0zsFOhDAQBuB36XmzQ7ctQznr0cS78TBDfwKxUFMqaozv7n0TX-DL9_JjnqUtZjS0lA2kqLvUVOgBJ3J537A3eltb-6Yr9rNO5mKeSmrrBjPavvPBBu-Hi3n8Wo92mLHVD_xe_lOvuUyS6VikgtJasZ8kOZdPGiSkMIl3HCVGBdC5Sft5ZthBbcJN4swBiZ3V6G6BHStrsIpOlOf7V289h3j3ev0LAAD__yw4TOI='
+ export DIRENV_DIR=$-/home/bernardo/Development/kitty
+ export VIRTUAL_ENV=$/home/bernardo/Development/kitty/.direnv/python-3.8.5

1 ответ

Решение

direnv export bashиспользует синтаксис только для bash; в частности, строки ANSI C:

DIRENV_DIR=$'-/home/bernardo/Development/kitty'

В Баш, $'...' почести убегает внутри ... -- так \tможет использоваться, например, для ссылки на вкладку. В sh, это вообще не признанная функция синтаксиса.

Таким образом, вам нужно запустить bash yourscriptне sh yourscript - или лучше начать сценарий с #!/usr/bin/env bash shebang, и запустите его с /path/to/yourscript (или просто yourscript если он установлен в месте в PATH), позволяя использовать shebang для выбора интерпретатора.

Другие вопросы по тегам