Bash 스크립트를 실행할 때는 모듈을 로드할 수 없고 가져올 때만 로드할 수 있는 이유는 무엇입니까?

Bash 스크립트를 실행할 때는 모듈을 로드할 수 없고 가져올 때만 로드할 수 있는 이유는 무엇입니까?

나는 사용하고있다기준 치수python/2.7.2모듈로 설치한 시스템의 패키지를 제어합니다 . python_exe.py간단한 "드라이브" 스크립트에서 호출할 간단한 Python 실행 파일이 있습니다 runit.sh. runit.sh스크립트는 다음과 같습니다.

#!/bin/bash
module load python/2.7.2
arg1=myarg1
arg2=15
arg3=$5
/path/to/python_exe.py -a $arg1 -b $arg2 -c $arg3

그러나 방금 실행하면 ./runit.sh"모듈: 명령을 찾을 수 없습니다"라는 메시지가 표시됩니다. 그러나 이렇게 하면 source runit.sh모듈이 올바르게 로드됩니다. 왜 이런거야?

답변1

module명령이 별칭 또는 셸 함수이기 때문에 ("패키지 초기화" 존재하다 모듈(1)). 라고 말하면 대화형 셸에 직접 명령을 입력하는 source runit.sh것과 같습니다 . module그러나 당신이 말할 때 ./runit.sh, 당신은 새로운 비대화형 쉘을 실행하고 있는 것입니다. 비대화형 쉘에는 일반적으로 표준 별칭과 쉘 기능이 설정되어 있지 않습니다.

모듈(1)"모듈 패키지와기준 치수쉘 특정 초기화 스크립트가 쉘에 전달되면 명령이 초기화됩니다. 이 스크립트는기준 치수별칭 또는 쉘 함수로 명령..." module스크립트에서 명령을 실행 해야 하는 경우 module스크립트 내에서 명령과 해당 초기화 스크립트를 찾으십시오.source

답변2

시스템에서 간단한 셸 호출은 정의된 별칭(또는 함수)을 상속하지 않으므로 module셸에서 이를 찾을 수 없는 것 같습니다(아래 발췌 설명 참조). 현재 어떻게 정의되어 있는지 type module확인하려면 프롬프트를 따르 십시오 .module

본질적으로 동일원천마치 키보드에서 스크립트의 모든 줄을 작성하는 것과 같습니다. 한편으로는 현재 셸의 모든 특정 기록을 상속하지만 다른 한편으로는 현재 셸은 스크립트 및 호출의 모든 측면
에 의해 영향을 받습니다 .module

~에 대한스크립트 가져오기와 스크립트 실행의 차이점슈퍼유저를 읽을 수 있습니다.2009년 9월또는2009년 12월, 우분투2011년 2월,유닉스2011년 8월, 스택 오버플로2012년 12월아니면 다른 많은 곳에서도요.

이와 관련하여,모듈 파일 부분하나 있다경고하다:

...모듈 파일을 언로드할 때 환경 변수가 설정되지 않았습니다. 따라서 모듈 파일을 로드한 후 언로드하는 것이 가능합니다.환경 변수를 이전 상태로 되돌리지 않고.

따라서 스크립트로 수행하는 것이 더 합리적인 것 같습니다..

후자를 달성하려면 다음과 같이 생각할 수 있습니다.

  1. 사용해야한다대화형 쉘, 현재 쉘의 특정 기록을 무시하고 수정셰르본당신의 스크립트

    #!/bin/bash -i
    

    대화형 쉘은 tty의 사용자 입력에서 명령을 읽습니다. 무엇보다도 이러한 셸은 시작 파일을 읽고, 프롬프트를 표시하고, 활성화되면 기본적으로 작업 제어를 활성화합니다.

  2. 대신에 현재 쉘을 상속하는 특정 스토리를 선호한다면 그것을 얻으려고 노력할 수 있습니다... 하지만서브쉘

    ( source runit.sh )
    
  3. 현재 별칭/함수를 찾아 module스크립트 type module를 수정해 보세요. 일부 환경 변수는 설정할 수 없습니다 module.
    필요한 경우 디렉토리에서 초기화 스크립트를 찾을 수 있습니다 $MODULESHOME/init/<shell>.


논평
기억나는 대로모듈 Q&A

하위 프로세스(스크립트)는 상위 프로세스의 환경을 변경할 수 없습니다. 스크립트 내의 모듈 로딩은 스크립트 자체의 환경에만 영향을 미칩니다.스크립트가 현재 환경을 변경하도록 하는 유일한 방법은 스크립트가 이를 현재 프로세스로 읽도록 하는 것입니다.

그래서 현재 환경을 수정하지 않으려면 변경을 시도하는 것이 더 좋다고 생각합니다.셰르본(1) 또는 서브셸에서 스크립트를 가져옵니다(2). 사례 (3)의 유용성에 대해 완전히 확신하지 못합니다.


노트
매뉴얼 및 설명 페이지에서 발췌기준 치수

module모듈 패키지의 사용자 인터페이스입니다. 이것module별칭 또는 기능프로그램을 실행 modulecmd하고 쉘이 명령의 출력을 평가하도록 하십시오. 첫 번째 매개변수는 modulecmd쉘 유형을 지정합니다.

모듈 패키지 및 module명령쉘 특정 초기화 스크립트가 쉘에 전달될 때 초기화됩니다.. 이 스크립트는 모듈 명령(별칭 또는 셸 함수)을 생성하고 모듈 환경 변수를 생성합니다.

관련 정보