不确定我在这里做错了什么。
User2 在其 .bash_profile 中获取一个文件来设置环境特定的别名。
# .bash_profile
source $HOME/set_environment_shortcuts
在 $HOME/set_environment_shortcuts 里面(这里有很多别名)。例子:
alias startservices="verylongcommand"
现在我想“从另一个用户启动服务”。
[User1@server1 ~]$ sudo su -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found
runuser 命令产生相同的结果。
[User1@Server1 ~]$ sudo runuser -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found
别名不能以这种方式工作吗?
请注意,当完全绕过别名时,该命令有效。
答案1
当 shell 非交互式时,别名不会扩展,除非expand_aliases
使用 来设置 shell 选项shopt -s expand_aliases
。
别名是一种交互式使用的快捷工具。对于任何类型的脚本,请改用 shell 函数:
startservices () {
# commands go here
}
Shell 函数在很多方面都比别名灵活得多。对于初学者来说,它们能够像 shell 脚本一样接受参数:
startservices () {
user="$1"
service="$2"
# code to start service "$service" as user "$user"
}
您不必明确获取其他用户的来源.bash_profile
。代替使用sudo -i
。这将启动一个登录 shell,.bash_profile
启动时将读取:
$ sudo -i -u User2 startservices
这需要startservices
是 中的脚本或其他外部实用程序、在$PATH
的User2
shell 启动文件中定义的 shell 函数,或者是在 的 shell 启动文件中定义的User2
别名(使用 set 运行 shell ) 。expand_aliases
User2
也可以看看是否有充分的理由运行 sudo su?
答案2
别名在 user1 的 .bash_profile 中定义。当您使用“su -l user2”时,它实际上会清除 user1 的所有环境变量并加载 user2 的变量,其中未定义“startservices”别名。
您可以使用“su -p”选项来保留当前环境,但在这种情况下,user2 必须具有 user1 的 .bashrc 文件的读取权限。