기본적으로 실행되어야 하는 초기화 스크립트를 작성하고 싶습니다.
nvm use v0.11.12 && forever start /srv/index.js
사용자로서 webconfig
. nvm
에 선언된 쉘 함수이며 ~webconfig/.nvm/nvm.sh
's를 통해 함수를 포함합니다.source ~/.nvm/nvm.sh
webconfig
.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.
그러니 당신이 할 수 있는 일은
사용자
~/.profile
또는 에서~/.bash_profile
기능을 정의합니다 . 존재~/.profile
하는 경우 무시~/.bash_profile
됩니다. 또한 이것은 bash에만 해당되므로 이를~/.bash_profile
사용할 것이라는 점 을 명심하세요 . 거기에 없는지 확인하세요..profile
~/.bash_profile
출처
~/.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'