root
사용자가 아니라 사용자에게 명령을 실행해야 합니다 gameservice
. 불행하게도 이 명령 은 bin 디렉토리 PATH
로 수화되지 않으므로 명령이 아닙니다.NVM
node
이와 같은 명령에서 직접 내보내기를 통해 작동하게 만들었지만 PATH
보기 흉합니다.
su gameservice -l -c "export PATH='$PATH:/home/gameservice/.nvm/versions/node/v13.7.0/bin/' && cd universalgame-server && ./node_modules/.bin/babel src -d dist --source-maps"
하지만 뭔가를 가지고 놀려고 하면 내 파일 .profile
과 내 .bashrc
파일이 모두 실행된다는 것을 증명할 수 있습니다.
root
with su gameservice -l
및 에서 사용자로 로그인하면 echo $PATH
내부에 nvm bin 디렉토리가 있습니다.
나는 bash가 어떻게 작동하는지에 대한 몇 가지 기본 지식을 놓치고 있는 것 같습니다. 누군가 내 오류를 발견할 수 있습니까?
답변1
여기서 문제는 bash
비대화형 쉘로 호출된다는 것입니다. 매뉴얼 페이지 에 따르면 bash
:
대화식 쉘은 옵션이 아닌 인수(-s가 지정되지 않는 한)와 표준 입력 및 오류가 모두 터미널에 연결된 -c 옵션 없이 시작되거나(isatty(3)에 의해 결정됨) -로 시작되는 쉘입니다. 나 옵션. PS1이 설정되고 bash가 대화형인 경우 $-에는 i가 포함되어 쉘 스크립트나 시작 파일이 이 상태를 테스트할 수 있습니다.
우분투에서는 기본값이 .bashrc
다음 줄로 시작됩니다.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
그래서 .bashrc
실행되지만 즉시 종료하기로 결정합니다. 해당 줄을 제거하면 PATH
변수가 파일에 있는 내용으로 설정되고 명령을 .bashrc
실행할 수 있습니다 node
.
제 생각에는 더 나은 접근 방식은 필요한 모든 환경을 설정하고 필요한 명령을 실행한 다음 사용자 이름으로 해당 스크립트를 실행하는 스크립트를 작성하는 것입니다. 이는 무슨 일이 있어도 작동하며 사용자 디렉터리의 시작 파일에 종속되지 않습니다.