"direnv export bash":生成的变量无缘无故在开头得到一个美元符号$?
"direnv export bash": Generated variable gets a dollar sign $ at the begin for no reason?
在我的脚本中,在我 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
direnv export bash
正在使用一些 bash-only 语法;具体来说,ANSI C 字符串:
DIRENV_DIR=$'-/home/bernardo/Development/kitty'
在bash中,$'...'
honors escape inside ...
-- 所以\t
可以用来指代选项卡,例如。 在sh
中,它根本不是一个可识别的语法特征。
因此您需要 运行 bash yourscript
,而不是 sh yourscript
-- 或者,更好的是,使用 #!/usr/bin/env bash
shebang 和 运行 启动脚本它与 /path/to/yourscript
(或者只是 yourscript
如果它安装在 PATH 中的某个位置),让 shebang 用于 select 解释器。
在我的脚本中,在我 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
direnv export bash
正在使用一些 bash-only 语法;具体来说,ANSI C 字符串:
DIRENV_DIR=$'-/home/bernardo/Development/kitty'
在bash中,$'...'
honors escape inside ...
-- 所以\t
可以用来指代选项卡,例如。 在sh
中,它根本不是一个可识别的语法特征。
因此您需要 运行 bash yourscript
,而不是 sh yourscript
-- 或者,更好的是,使用 #!/usr/bin/env bash
shebang 和 运行 启动脚本它与 /path/to/yourscript
(或者只是 yourscript
如果它安装在 PATH 中的某个位置),让 shebang 用于 select 解释器。