在 Mac 中使用 sudo 时别名未被拾取?

在 Mac 中使用 sudo 时别名未被拾取?

我在 中有以下别名/etc/profile

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
        eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
        [ -r /etc/bashrc ] && . /etc/bashrc
fi

alias startapache="/usr/local/Cellar/httpd22/2.2.29/bin/apachectl start"
alias stopapache="/usr/local/Cellar/httpd22/2.2.29/bin/apachectl stop"

alias ll='ls -lG'

我刚刚添加了最后三个别名。现在我

sudo su:我没有注意到这些别名。

sh-3.2# startapache
sh: startapache: command not found

但当我没有 sudoing,我得到了这个别名(这是 bash shell)。但它没有启动 apache。

local:~ 112019$ startapache 
(13)Permission denied: make_sock: could not bind to address [::]:80
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

答案1

shellbash只读取/etc/profile在作为登录外壳,这su通常不会发生 - 您需要su使用--l--login选项进行调用。来自man su

   -, -l, --login
       Provide an environment similar to what the user would expect had
       the user logged in directly.

       When - is used, it must be specified as the last su option. The
       other forms (-l and --login) do not have this restriction.

man bash有关交互式登录、交互式非登录和非交互式 shell 读取哪些启动文件的详细信息,请参阅。

答案2

为了使这些别名可用于root,您可以将它们放入/root/.bash_aliases

但是,如果您只需要以root您的用户身份运行这些别名,那么您只需将它们放入~/.bash_aliases并添加到sudo每个别名命令的开头即可:

alias startapache="sudo /usr/local/Cellar/httpd22/2.2.29/bin/apachectl start"
alias stopapache="sudo /usr/local/Cellar/httpd22/2.2.29/bin/apachectl stop"
alias ll='sudo ls -lG'

另外,我起初没有注意到这一点,但使用ll的别名ls -lG会压倒默认ll别名的行为,无论是在 中设置 /root/.bash_profile还是在 中设置~/.bash_profile,它都被设置为 的别名ls -la:所以,除非你想压倒ll最终会为其添加这些别名的用户的别名行为,否则你应该将其名称更改为其他名称,例如lg

alias lg='sudo ls -lG'

相关内容