我在 中有以下别名/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'