Bash
以其他使用者身份執行 Alias 命令失敗
不知道我在這裡做錯了什麼。
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
別名不能以這種方式工作嗎?
請注意,當完全繞過別名時,該命令有效。
當 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 函式User2
,或者是在 的 shell 啟動文件中定義的別名(使用expand_aliases
set 執行的 shell)User2
。