虚拟环境的激活脚本在带有set -euo选项的bash脚本中无法运行

11
我试图创建一个Bash脚本,激活虚拟环境, pip安装requirements.txt并继续执行。 这将成为我的init.sh脚本,以备日后商业使用。
#!/usr/bin/env bash

set -euo pipefail

. ${DIR}/scripts-venv/bin/activate
pip install -r requirements.txt

其中${DIR}设置为包含虚拟环境的目录。问题似乎在上述set -euo中,这是某些风格指南中建议的bash脚本的推荐开始。更具体地说,它是u选项-交互式引起了错误/ scripts-venv / bin / activate:line 57:PS1:未绑定变量。我可以将其删除,但只是想知道为什么会出现这种情况。 谢谢


1
那个回声是什么?尝试使用-euxo,像这样http://explainshell.com/explain?cmd=set+-euxo%20pipefail - Shivkumar kondi
2个回答

15

如果您可以更新,virtualenv >= 16.2 将不再出现由于未设置 PS1 而导致的错误

如果您能够更新 virtualenv 库,您会发现这个问题已经修复。它在 pypa/virtualenv/pull/922 中得到了修复,并包含在 16.2 里程碑中。


关于版本 < 16.2;以及对您所看到的内容的解释

$PS1 是出现在您的 Bash 提示符中 $ 前面的文本。-u 表示未绑定变量的引用是错误的。由于 /scripts-venv/bin/activate 引用了 $PS1,并且交互式 shell 上没有提示符,因此这是一个未绑定的变量,-u 导致脚本失败。

也许这可以帮助您:

https://unix.stackexchange.com/questions/170493/login-non-login-and-interactive-non-interactive-shells

当您调用脚本时,运行该脚本的 Shell 没有提示符。现在,请查看 bin/activate,第 57 行:

_OLD_VIRTUAL_PS1="$PS1" 

您可以看到$PS1将被评估,因为您设置了-u,所以脚本无法继续,因为-u表示尝试对未设置的变量进行参数评估是一个错误。

以下是一些选项:

选项1:您可以修复bin/activate

第57行:

-   _OLD_VIRTUAL_PS1="$PS1"  
+   _OLD_VIRTUAL_PS1="${PS1:-}" 

第61行:

-        PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
+        PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1:-}"

:- 语法使得扩展默认为空字符串,而不是未绑定,从而避免了错误。但这种方法很笨拙,因为你正在操作 virtualenv 创建的代码。

选项2:解决它

也许最好在 activate 脚本中删除 -u

尝试运行这个脚本,看看我的意思:

#!/bin/bash

set -eux
echo "Testing vitualenv"
set +u
. venv/bin/activate
set -u
echo "Test complete $?"

通过在激活期间关闭-u,然后再重新打开它,您可以避免虚拟环境的尴尬之处(如果您不想修复它)。


选项3 [未来!]

只需更新virtualenv,使其版本>=16.2。 pip install --upgrade virtualenv


1
你知道为什么$PS1会未绑定吗? - AmaJayJB
1
在非交互式 shell 中,PS1 没有定义提示符文本,因为没有提示符。 PS1 是提示符文本。 请参阅此处网址:https://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html - JawguyChooser
我刚刚更新了virtualenv,但是我仍然收到错误信息。也许我需要创建一个新的virtualenv? - Calimo

-1

移除 set -euo pipefail ... 它将正常工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接