在bash脚本中激活python虚拟环境失败;sudo:source:command not found";
我正在尝试使用Bash在ubuntu18.04上自动部署我的Python Flask应用程序,方法是准备所有必要的文件/目录,从Github克隆源代码,然后创建虚拟环境,安装必要的模块等等 现在,因为我必须使用在bash脚本中激活python虚拟环境失败;sudo:source:command not found";,python,bash,sh,virtualenv,Python,Bash,Sh,Virtualenv,我正在尝试使用Bash在ubuntu18.04上自动部署我的Python Flask应用程序,方法是准备所有必要的文件/目录,从Github克隆源代码,然后创建虚拟环境,安装必要的模块等等 现在,因为我必须使用sudo执行Bash脚本,这意味着整个脚本将作为root执行,除非我使用sudo-u myuser另外指定,并且在激活虚拟环境时,我得到以下输出:sudo:source:command not found和我随后的pip安装都安装在虚拟环境之外。我的代码摘录如下: #/bin/bash .
sudo
执行Bash脚本,这意味着整个脚本将作为root
执行,除非我使用sudo-u myuser
另外指定,并且在激活虚拟环境时,我得到以下输出:sudo:source:command not found
和我随后的pip安装都安装在虚拟环境之外。我的代码摘录如下:
#/bin/bash
...
sudo-u“$user”python3-m venv.env
sudo-u$sudo_USER source/srv/www/www.mydomain.com/.env/bin/activate
sudo-u“$user”pip安装控制盘
sudo-u“$user”pip安装uwsgi
sudo-u“$user”pip安装-r requirements.txt
...
现在就我的生活而言,我不知道如何在虚拟环境的上下文中激活虚拟环境,如果这有任何意义的话
我在网上搜索了一下,发现的大多数问题/答案都围绕着如何在Bash脚本中激活虚拟环境,而不是如何在作为
sudo
执行的Bash脚本中作为单独的用户激活虚拟环境,这是因为source
不是可执行文件,而是一个内置的bash
命令。它不适用于sudo
,因为后者接受程序名(即可执行文件)作为参数
另外,不清楚为什么必须以root用户身份执行整个脚本。如果您只需要以root用户身份执行多个命令(例如用于启动/停止服务)并以普通用户身份运行剩余的大多数命令,则只能对这些命令使用sudo。例如,下面的脚本
#/bin/bash
#“whoami”命令输出当前用户名。与“source”不同,这是
#完整的可执行文件,而不是内置命令
哇
sudowhoami
sudo-u postgres whoami
在我的机器输出上
trolley813
root
postgres
p.p.S.您可能不需要将环境激活为
root
,这是因为source
不是一个可执行文件,而是一个内置的bash
命令。它不适用于sudo
,因为后者接受程序名(即可执行文件)作为参数
另外,不清楚为什么必须以root用户身份执行整个脚本。如果您只需要以root用户身份执行多个命令(例如用于启动/停止服务)并以普通用户身份运行剩余的大多数命令,则只能对这些命令使用sudo。例如,下面的脚本
#/bin/bash
#“whoami”命令输出当前用户名。与“source”不同,这是
#完整的可执行文件,而不是内置命令
哇
sudowhoami
sudo-u postgres whoami
在我的机器输出上
trolley813
root
postgres
p.p.S.您可能不需要以
root
的身份激活环境,您知道source
的功能吗?无论如何,即使source
可以工作,virtualenv也会在sudo
完成时停用。整个脚本必须在一个sudo
会话下运行。你知道source
做什么吗?无论如何,即使source
可以工作,virtualenv也会在sudo
完成时停用。整个脚本必须在一个sudo
会话下运行。我以root
身份运行脚本的原因是,我在脚本中运行的某些命令需要sudo
停止和启动服务,除非我对sudo
感到困惑。我没有提到我也尝试过不使用source
,下面是我尝试过的一行:pythonsudo-u“$user”/srv/www/www.domain.com/.env/bin/activate
据我所知,
只是source
@JeremyTan的别名。如果您仅将sudo
用于所需的命令(以普通用户身份运行整个脚本),它们仍将作为root用户(或指定为sudo
参数的任何用户)执行@JeremyTan我已经更新了答案,并添加了一个示例。我之所以以root
的身份运行脚本,是因为我在脚本中运行的一些命令需要sudo
类似于停止和启动服务,除非我对sudo
感到困惑。我没有提到我也尝试过不使用source
,下面是我尝试过的一行:pythonsudo-u“$user”/srv/www/www.domain.com/.env/bin/activate
据我所知,
只是source
@JeremyTan的别名。如果您仅将sudo
用于所需的命令(以普通用户身份运行整个脚本),它们仍将作为root用户(或指定为sudo
参数的任何用户)执行@JeremyTan我已经更新了答案,添加了一个例子。