sudo
命令不使用你的 shell 来运行命令,它直接 exec
执行指定的命令。这意味着 (a) 没有任何内容会 source root 的 bash_profile
,因此无论你在那里放置什么都无关紧要,(b) 即使设置了 shell 别名,也不会起作用。
因此,如果您想使用别名来指定不同于 PATH 上的 Python 版本,则不能使用 sudo python
来运行它。
最简单、也可能是最安全的解决方法是明确指定路径:运行 sudo /path/to/other/python
。如果您需要经常这样做,可以为此创建一个别名。
如果您真的想要,可以使 sudo
使用一个 shell。可以显式生成运行 python
的 bash
命令行,也可以(更简单地)使用 -s
或 -i
标志。(在这种情况下,如果您尝试运行 root 的 ~/.bash_profile
,-s
将无法实现,但 -i
可以。)但是,使用 sudo
运行 shell 不如使用 sudo
运行程序安全。如果您的 sudoers
已经明确配置为禁止该操作,甚至可能无法这样做。(如果您愿意,可以使用 visudo
修复它,但是在不完全理解正在开放的安全漏洞时打开一个安全漏洞通常被认为是一件坏事。)
sudo /path/to/other/python foo.py
来说,sudo \
which python` foo.py` 要简单一些。 - anthonybellbin目录可能在引用旧版的Python。
> ls -la /usr/bin/python
lrwxrwxrwx 1 root root 9 Dec 21 2013 /usr/bin/python -> python2.7
我建议在调用脚本时使用sudo -i
。直接从man sudo中引用:
-i [command]
-i(模拟初始登录)选项以目标用户的passwd(5)条目中指定的shell作为登录shell运行。这意味着将由shell读取特定于登录的资源文件,例如.profile或.login。如果指定了命令,则将其传递给shell以执行。否则,将执行交互式shell。sudo尝试在运行shell之前更改到该用户的主目录。它还初始化环境,保持DISPLAY和TERM不变,设置HOME、MAIL、SHELL、USER、LOGNAME和PATH,以及Linux和AIX系统上/etc/environment的内容。所有其他环境变量都将被删除。
问题在于您的$PATH
在执行时发生了变化。
您可以使用sudo -E
:
-E -E(保留环境)选项将覆盖sudoers(5)中的env_reset选项。仅当匹配命令具有SETENV标记或在sudoers(5)中设置setenv选项时才可用。
... 或者您可以指定可执行文件的完整路径。sudo `which python`
。
(看起来您根据文档使用了alias
。这种方法也可以处理它。)
-E
不能帮助别名;你需要使用sudo
来获取shell别名(可以明确地使用-s
或-i
,也可以隐式地使用)。 - abarnertwhich python
" 可以处理它。 - Jeff Ferland