我正在尝试创建一个激活virtualenv的bash脚本,pip安装requirements.txt并继续。这将是我以后的业务的init.sh脚本。
#!/usr/bin/env bash
set -euo pipefail
. ${DIR}/scripts-venv/bin/activate
pip install -r requirements.txt
其中$ {DIR}设置为包含virtualenv的目录。似乎问题在于上面的set -euo
,这是根据某些样式指南推荐脚本的开始。更具体地说,它是u
选项 - 交互式,提供错误/scripts-venv/bin/activate: line 57: PS1: unbound variable
。我可以删除它,但只是想知道为什么会发生这种情况。
感谢
答案 0 :(得分:5)
如果您能够更新virtualenv
库,您会发现现在已修复此问题。它固定在pypa/virtualenv/pull/922中,包含在16.2里程碑中。
< 16.2
;并解释你所看到的 $PS1
是在bash提示符中显示在$
前面的文字。 -u
表示对未绑定变量的引用是错误。由于/scripts-venv/bin/activate
引用$PS1
,并且由于交互式shell上没有提示,因此这是一个未绑定的变量,-u
会导致脚本失败。
也许这会有所帮助:
当您调用脚本时,运行该脚本的shell没有提示。现在,查看bin/activate
,第57行:
_OLD_VIRTUAL_PS1="$PS1"
您可以看到$PS1
将被评估,并且因为您设置了-u
,您的脚本无法继续,因为-u
表示尝试进行参数评估未设置变量的错误。
以下是一些选项:
bin/activate
第57行:
- _OLD_VIRTUAL_PS1="$PS1"
+ _OLD_VIRTUAL_PS1="${PS1:-}"
第61行:
- PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
+ PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1:-}"
:-
语法导致扩展默认为空字符串而不是未绑定,因此没有错误。但这很重要,因为你正在弄乱virtualenv
创建的代码。
在-u
脚本中删除activate
可能更好。
试试这个脚本,看看我的意思:
#!/bin/bash
set -eux
echo "Testing vitualenv"
set +u
. venv/bin/activate
set -u
echo "Test complete $?"
通过在激活期间关闭-u
然后再将其重新打开,您可以解决virtualenv尴尬(如果您不想修复它)。
只需更新virtualenv,即版本&gt; = 16.2。 pip install --upgrade virtualenv
答案 1 :(得分:0)
删除 set -euo pipefail
...它会工作得很好