다음과 같이 선언된 bash 함수가 있습니다.
function foo {
echo "this is foo";
}
나는 그것을 호출하지 않았지만 export -f foo
여전히 서브 쉘에서 작동합니다.
그러나 일반적으로 다음과 같은 함수를 선언할 때:
foo(){
echo "this is foo";
}
그런 다음 전화해야합니다.
export -f foo;
다른 선언 구문에서 내보내기 동작에 차이가 있다고 생각합니까?
내가 아는 한 함수를 내보낼 필요는 없습니다.
. my_script_with_foo_in_it.sh # this is in ~/.bash_profile/.bashrc
그런 다음 bash 쉘을 호출할 수 있습니다.
foo
기능을 내보내지 않아도 문제가 없습니다.
답변1
source
스크립트를 사용하거나 얻을 때 .
스크립트의 내용은 현재 셸의 컨텍스트에서 실행됩니다. 소스 스크립트에 정의된 모든 함수와 쉘 변수(내보내기 제외)는 소스 스크립트 다음의 현재 쉘에서 사용할 수 있습니다. 이것은목적스크립트를 찾고 있습니다.
/etc/profile
예를 들어 이는 또는 파일이 대화형/로그인 셸에 대한 기본 환경을 설정하는 /etc/bash.bashrc
방법 입니다 .
또한 일부 명령은 쉘 환경을 복제하는 하위 쉘 환경에서 실행됩니다. 이러한 환경에서는 쉘 변수와 함수를 사용할 수 있습니다. POSIX 표준도 참조하세요.쉘 실행 환경(내 강조점):
서브쉘 환경복사본으로 생성해야 함무시되지 않는 신호 트랩을 기본 작업으로 설정해야 한다는 점에서 쉘 환경이 다릅니다. 서브쉘 환경에 대한 변경사항은 쉘 환경에 영향을 주어서는 안됩니다. 명령 대체, 괄호로 그룹화된 명령 및 비동기 목록은 서브쉘 환경에서 실행되어야 합니다. 또한 다중 명령 파이프라인의 각 명령은 하위 셸 환경에 있지만 확장으로 파이프라인의 일부 또는 모든 명령을 현재 환경에서 실행할 수 있습니다. 다른 모든 명령은 현재 쉘 환경 내에서 실행되어야 합니다.
서브쉘은 서브프로세스와 동일하지 않습니다.
변수 내보내기는 환경 변수를 생성할 때만 필요합니다. 환경 변수는 모든 하위 프로세스에 의해 상속됩니다.
또한목차쉘이 다음을 얻으려고 시도하기 때문에 호출이 ~/.bash_profile
약간 혼란스럽습니다.bash
일반 파일 ~/.bash_profile
로그인 쉘을 시작할 때. 쉘 초기화 파일을 다른 곳으로 이동하려면 디렉터리 이름을 ~/.bash_profile
또는 와 같은 이름으로 바꾸는 것이 좋습니다. 이러한 파일을 자동으로 가져오려면 및 에서 해당 파일을 호출해야 합니다.~/.shell
~/.shell_startup
~/.bash_profile
~/.bashrc