su user -l 및 su user -l -c "cmd"는 동일한 결과를 제공하지 않습니다.

su user -l 및 su user -l -c "cmd"는 동일한 결과를 제공하지 않습니다.

root사용자가 아니라 사용자에게 명령을 실행해야 합니다 gameservice. 불행하게도 이 명령 은 bin 디렉토리 PATH로 수화되지 않으므로 명령이 아닙니다.NVMnode

이와 같은 명령에서 직접 내보내기를 통해 작동하게 만들었지만 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파일이 모두 실행된다는 것을 증명할 수 있습니다.

rootwith 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.

제 생각에는 더 나은 접근 방식은 필요한 모든 환경을 설정하고 필요한 명령을 실행한 다음 사용자 이름으로 해당 스크립트를 실행하는 스크립트를 작성하는 것입니다. 이는 무슨 일이 있어도 작동하며 사용자 디렉터리의 시작 파일에 종속되지 않습니다.

관련 정보