在 Ubuntu 12.04 机器上,我使用替代系统来设置编辑到vim 基本版。当 root 时我得到了正确的编辑器,但当我 sudo 到 root 并运行 crontab 时却没有,我试图理解为什么。
更详细一点。另一种选择编辑目前设置为vim 基本版通过手动模式(输出调整):
% sudo update-alternatives --set editor /usr/bin/vim.basic
% update-alternatives --display editor
editor - manual mode
link currently points to /usr/bin/vim.basic
/bin/nano - priority 40
slave editor.1.gz: /usr/share/man/man1/nano.1.gz
/usr/bin/vim.basic - priority 30
slave editor.1.gz: /usr/share/man/man1/vim.1.gz
slave editor.fr.1.gz: /usr/share/man/fr/man1/vim.1.gz
slave editor.it.1.gz: /usr/share/man/it/man1/vim.1.gz
slave editor.pl.1.gz: /usr/share/man/pl/man1/vim.1.gz
slave editor.ru.1.gz: /usr/share/man/ru/man1/vim.1.gz
Current 'best' version is '/bin/nano'.
如果我 sudo 到 root 并编辑 crontab 编辑器是 vim.basic:
% sudo -i
% crontab -e
# editor is vim; :help shows
# *help.txt* For Vim version 7.3. Last change: 2010 Jul 20
作为 root 的 EDITOR 和 SHELL:
# env | grep -i editor
EDITOR=vim
# echo $0
-bash
但是,作为普通用户,如果我 sudo crontab 编辑器是 nano:
% sudo crontab -e
# GNU nano 2.2.6
作为普通用户的 EDITOR 和 SHELL:
% env | grep -i editor
EDITOR=vim
% echo $0
zsh
现在我注意到纳米具有比以下更高的优先级 (40)vim 基本版(30),这样我就可以改变 vim.basic 的优先级。但这违背了目的手动模式。
更新
我注意到使用须藤-E给出了正确的编辑器,这意味着问题与环境有关。那是:
sudo crontab -e # nano editor is used
sudo -E crontab -e # vim editor is used
答案1
在大多数配置中,sudo 会删除大多数环境变量。您可以通过sudo -V
以 root 身份(即sudo sudo -V
具有 sudo 权限的用户)运行来查看 sudo 配置。
在 Ubuntu 上,除了一个小列表之外,变量都会被删除,并且EDITOR
和VISUAL
不在要保留的列表中。因此,当您运行时sudo somecommand
,您的每用户编辑器首选项不会在运行时应用somecommand
。
当您运行 时sudo -E
,文件将被复制到临时位置,然后 sudo 运行您的编辑器而无需任何其他权限,最后,如果编辑器返回成功状态,则临时文件将被移动到最终位置。由于编辑器是在没有额外权限的情况下执行的,因此 sudo 不会剥离环境。
您应该sudo -E
尽可能使用,因为这可以让您运行您最喜欢的编辑器,而不必担心以提升的权限运行程序。如果这是不可能的(例如,要运行 )crontab -e
,您可以通过在 sudo 执行的命令中再次定义您的首选项来选择您的编辑器:
sudo env VISUAL=vim crontab -e