Bash
通過 sudo 執行 nvm(bash 函式)
我想編寫一個基本上應該執行的初始化腳本
nvm use v0.11.12 && forever start /srv/index.js
作為使用者
webconfig
。nvm
是一個在 in 中聲明的 shell 函式,~webconfig/.nvm/nvm.sh
通過source ~/.nvm/nvm.sh
inwebconfig
的.bashrc
.我嘗試了以下方法:
sudo -H -i -u webconfig nvm echo "nvm" | sudo -H -i -u webconfig
但他們失敗了
-bash:nvm:找不到命令
-bash:第 1 行:nvm:找不到命令
當我在該 shell 中執行
sudo -H -i -u webconfig
並手動輸入時,它可以工作。nvm
我究竟做錯了什麼?
這裡的問題通常是關於不同類型的 shell:
- 當您打開終端仿真器(
gnome-terminal
例如)時,您正在執行所謂的互動式非登錄shell。- 當您從命令行登錄到您的機器,或執行諸如
su username
、 或之類的命令時sudo -u username
,您正在執行一個互動式登錄shell。因此,根據您啟動的 shell 類型,會讀取一組不同的啟動文件。來自
man bash
:When bash is invoked as an interactive login shell, or as a non-inter‐ active shell with the --login option, it first reads and executes com‐ mands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.
換句話說,
~/.bashrc
被登錄 shell 忽略。由於您使用-i
to 選項sudo
,因此正在讀取使用者登錄 shell 的啟動文件(從man sudo
):-i, --login Run the shell specified by the target user's password data‐ base entry as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell.
所以,你能做的是
~/.profile
在使用者的or中定義函式~/.bash_profile
。請記住,~/.profile
如果~/.bash_profile
存在,則會被忽略。還要記住,這~/.bash_profile
是特定於 bash 的,所以我會使用它.profile
,只要確保它~/.bash_profile
不存在。- 來源
~/.nvm/nvm.sh
來自~/.profile
。