sudo(bash 기능)를 통해 nvm 실행

sudo(bash 기능)를 통해 nvm 실행

기본적으로 실행되어야 하는 초기화 스크립트를 작성하고 싶습니다.

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

사용자로서 webconfig. nvm에 선언된 쉘 함수이며 ~webconfig/.nvm/nvm.sh's를 통해 함수를 포함합니다.source ~/.nvm/nvm.shwebconfig.bashrc

나는 다음을 시도했다:

sudo -H -i -u webconfig nvm

echo "nvm" | sudo -H -i -u webconfig

하지만 그들은 실패했다

-bash:nvm:명령을 찾을 수 없음
-bash:line 1:nvm:명령을 찾을 수 없음

해당 셸에서 수동으로 실행 sudo -H -i -u webconfig하고 입력하면 작동합니다. nvm내가 뭘 잘못했나요?

답변1

종종 그렇듯이 여기서 문제는 다양한 유형의 쉘에 있습니다.

  • 예를 들어 터미널 에뮬레이터를 열면 gnome-terminal다음과 같은 작업이 수행됩니다.대화형, 비로그인껍데기.

  • 명령줄에서 컴퓨터에 로그인하거나 su username, 같은 명령을 sudo -u username실행 하는 경우대화형 로그인껍데기.

따라서 시작하는 셸 유형에 따라 다른 시작 파일 세트를 읽습니다. 에서 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로그인 쉘에서는 무시됩니다. -i옵션을 사용하고 있으므로 sudo사용자 로그인 셸의 시작 파일(from)을 읽고 있습니다 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또는 에서 ~/.bash_profile기능을 정의합니다 . 존재 ~/.profile하는 경우 무시 ~/.bash_profile됩니다. 또한 이것은 bash에만 해당되므로 이를 ~/.bash_profile사용할 것이라는 점 을 명심하세요 . 거기에 없는지 확인하세요..profile~/.bash_profile

  2. 출처 ~/.nvm/nvm.sh~/.profile.

답변2

@테덴여기에 몇 가지 세부 사항이 추가되었으므로 반복하지 않겠습니다. 다시 말하지만, 문제의 원인은 bash로그인 셸로 호출할 때 자동으로 발생하지 않고 , 또는 만 찾는 이상한 동작일 가능성 이 .bashrc높습니다 .~/.bash_profile~/.bash_login~/.profile

.bashrc일반적인 방법은 이러한 구성 파일 중 하나에 코드를 추가하여 기본적으로 다음 코드를 갖는 것입니다 ~/.profile.

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

고쳐 쓰다

아래 의견에 따르면 가장 좋은 해결책은 [ -z "$PS1" ] && return해당 .bashrc하고 다른 모든 내용은 변경하지 않는 것입니다.

답변3

sudo -Hu webconfig bash -c '. ~/.nvm/nvm.sh && nvm'

관련 정보