我想以 root 身份运行这个程序。它激活一个虚拟环境并在该虚拟环境中运行 python 程序。
程序看起来像这样
$cat myfile.sh
source /pathto/venv/bin/activate
python /pathto/rsseater.py
如果我只是以 root 身份运行它,我会得到
$ sudo ./myfile.sh
./myfile.sh: 2: ./myfile.sh: source: not found
我发现这但如果我尝试添加sudo -s
到文件顶部,它似乎会将提示更改为 # - 但 python 不会按预期运行。当我在文件顶部有 sudo -s 时,我不确定程序在做什么。
我怎样才能让这个程序以 root 身份运行?
答案1
您通常希望在脚本顶部添加对解释器的调用,如下所示:
$cat myfile.sh
#!/bin/bash
source /pathto/venv/bin/activate
python /pathto/rsseater.py
这可能看起来与您所拥有的非常相似,但实际上非常不同。在您的场景中,您尝试在运行时调用的 shell 中运行命令sudo
。通过上面的示例,您将获得一个单独的 Bash shell,#!/bin/bash
其中调用的行后面将包含各种命令。#!/bin/bash
导致新的 Bash shell 被分叉。
口译员和 Shebang
的命名法#!
称为 shebang。你可以通过本网站上的各种问答了解更多相关信息还有关于维基百科。但可以说,它告诉系统,当“执行”(也称为运行)给定的文件时,首先从磁盘加载程序(解释器),然后该程序的任务是解析您的文件的内容。刚刚被执行。
笔记:基本上是 shebang 线之后的所有内容。
口译员
解释器是一种可以一次处理文件中一个命令的程序。在本例中,我们使用 Bash shell 作为解释器。但您也可以在这里使用其他 shell,例如 C shell 或 Korne shell 等。
您还可以以同样的方式使用更高级别的解释器,例如 Perl、Ruby 或 Python。
为什么使用“sudo -s”时出错
如果你看一下手册页,sudo
它有这样的说法-s
:
-s [command]
The -s (shell) option runs the shell specified by the SHELL
environment variable if it is set or the shell as specified in
the password database. If a command is specified, it is passed
to the shell for execution via the shell's -c option. If no
command is specified, an interactive shell is executed.
因此,当您运行此命令时:
$ sudo -s ./myfile.sh
发生以下情况:
$ /bin/sh
sh-4.2$ source somesource.bash
sh: source: somesource.bash: file not found
shell/bin/sh
不支持该命令source
。