Bash

通過 sudo 執行 nvm(bash 函式)

  • April 21, 2014

我想編寫一個基本上應該執行的初始化腳本

nvm use v0.11.12 && forever start /srv/index.js

作為使用者webconfignvm是一個在 in 中聲明的 shell 函式,~webconfig/.nvm/nvm.sh通過source ~/.nvm/nvm.shinwebconfig.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 忽略。由於您使用-ito 選項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. 

所以,你能做的是

  1. ~/.profile在使用者的or中定義函式~/.bash_profile。請記住,~/.profile如果~/.bash_profile存在,則會被忽略。還要記住,這~/.bash_profile是特定於 bash 的,所以我會使用它.profile,只要確保它~/.bash_profile不存在。
  2. 來源~/.nvm/nvm.sh來自~/.profile

引用自:https://unix.stackexchange.com/questions/125791