为什么 vi 和 sudo vi 给我不同版本的 vim?

为什么 vi 和 sudo vi 给我不同版本的 vim?

Ubuntu Hardy 自带的 vi 默认版本是 7.1 或 7.2。因此我从源代码安装了 vim 7.3。

然后为了方便,我将其添加到我的.bashrc

alias vi='vim'

为了让 7.3 vim 覆盖旧版本的 vi。这对我来说没问题,但是当我在之前添加 sudo 时,会出现类似

sudo vi /usr/local/nginx/conf/nginx.conf

它给了我旧版本

谁能告诉我这是为什么?

答案1

7.2 和 7.3不存在。 只有050325vim7.2两个完全独立的程序,但功能相似。如果您想要vim, 类型vim


您的别名不起作用的原因在于别名是由您的 shell 扩展的,而 shell 不知道每个程序将要做什么 —— 它将“ sudo”视为命令,将“ vi myfile”视为参数,并且只尝试扩展第一个单词“ sudo”,而不敢触碰参数。

告诉狂欢通过添加别名来扩展某些命令后的别名,例如:(注意引号内的空格是必需的)

alias sudo="sudo "

空格将告诉 bash“ sudo”后的第一个单词是应该扩展的命令——例如,现在"sudo vi ..."扩展为“ sudo vim ...”就可以了。


答案说得/root/.bashrc不对,有几个原因。首先,sudo执行给定的命令没有运行 shell。(可以使用或进行更改,但如果未给出任何选项,则默认行为是直接执行命令,而不使用 shell。)sudo -s cmdsudo -i cmd

其次,bash 只会在以下情况下扩展别名:交互的模式,而不是以 方式运行时,后者才是应该使用的。(同样,这可以更改,但默认设置是仅以交互方式扩展别名。)bash -c cmdsudo

答案2

别名是针对每个用户的。您的第一个命令仅将别名分配给了您的非特权用户,当您使用 sudo 时,它将以 root 身份运行。您也应该为 root 用户创建别名。

答案3

运行时sudo vi

  1. sudo加载/root/.bashrc文件。并确定它是别名还是原始文件(即vim)。
  2. 然后解析该vi部分/root/.vimrc是否存在。否则/etc/vim/vimrc

相关内容