"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 для выбора интерпретатора.