셸 스 크 립 트 에서 다른 스 크 립 트 를 호출 하 는 세 가지 다른 방법 (fork, exec, source)

3074 단어
포크  (/directory/script. sh): 셸 에 실행 명령 이 포함 되 어 있다 면 하위 명령 은 부모 명령 에 영향 을 주지 않 고 하위 명령 이 실 행 된 후에 부모 명령 을 수행 합 니 다.하위 급 의 환경 변 수 는 부모 급 에 영향 을 주지 않 습 니 다.포크 는 가장 일반적인 것 입 니 다. 바로 스 크 립 트 에서/directory/script. sh 로 script. sh 를 호출 하 는 것 입 니 다. 실행 할 때 sub - shell 로 호출 된 스 크 립 트 를 엽 니 다. sub - shell 이 실 행 될 때 parent - shell 은 그대로 있 습 니 다.sub - shell 실행 이 끝 난 후 parent - shell 로 돌아 갑 니 다. sub - shell 은 parent - shell 에서 환경 변 수 를 계승 합 니 다. 그러나 sub - shell 의 환경 변 수 는 parent - shell 로 가 져 오지 않 습 니 다.
2. exec (exec/directory/script. sh): 하위 명령 을 실행 한 후 부모 명령 을 실행 하지 않 습 니 다.exec 는 fork 와 달리 호출 된 스 크 립 트 를 실행 하기 위해 sub - shell 을 새로 열 필요 가 없습니다.  호출 된 스 크 립 트 는 부모 스 크 립 트 와 같은 셸 에서 실 행 됩 니 다.그러나 exec 를 사용 하여 새 스 크 립 트 를 호출 하면 부모 스 크 립 트 의 exec 줄 이후 의 내용 은 더 이상 실행 되 지 않 습 니 다.이것 은 exec 와 source 의 차이 이다.
3. source (source/directory/script. sh): 하위 명령 을 실행 한 후에 부모 명령 을 계속 실행 하 는 동시에 하위 설정 의 환경 변 수 는 부모 급 환경 변수 에 영향 을 줄 수 있 습 니 다.fork 와 의 차 이 는 sub - shell 을 새로 열 어 호출 된 스 크 립 트 를 실행 하지 않 고 같은 셸 에서 실행 하 는 것 입 니 다. 따라서 호출 된 스 크 립 트 에서 설명 하 는 변수 와 환경 변 수 는 주 스 크 립 트 에서 얻 고 사용 할 수 있 습 니 다.
다음 두 스 크 립 트 를 통 해 세 가지 호출 방식 의 차 이 를 느 낄 수 있 습 니 다: cat 1. sh:
#!/bin/bash
A=B 
echo "PID for 1.sh before exec/source/fork:$$"
export A
echo "1.sh: \$A is $A"
case $1 in
        exec)
                echo "using exec…"
                exec ./2.sh ;;
        source)
                echo "using source…"
                . ./2.sh ;;
        *)
                echo "using fork by default…"
                ./2.sh ;;
esac
echo "PID for 1.sh after exec/source/fork:$$"
echo "1.sh: \$A is $A"

cat 2.sh:
#!/bin/bash
echo "PID for 2.sh: $$"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
echo "2.sh: \$A is $A"

결과:
[root@localhost ~]# ./1.sh 
PID for 1.sh befor exec/source/fork:1076
1.sh:$A is B
using fork by default...
PID for 2.sh: 1077
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:1076
1.sh:$A is B
[root@localhost ~]# ./1.sh exec
PID for 1.sh befor exec/source/fork:1078
1.sh:$A is B
using exec...
PID for 2.sh: 1078
2.sh get $A=B from 1.sh
2.sh: $A is C
[root@localhost ~]# ./1.sh source
PID for 1.sh befor exec/source/fork:1079
1.sh:$A is B
using source...
PID for 2.sh: 1079
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:1079
1.sh:$A is C
[root@localhost ~]#

이 를 통 해 알 수 있 습 니 다: fork ()   1. sh 와 2. sh 는 각각 다른 프로 세 스 입 니 다. 하위 프로 세 스 는 부모 프로 세 스 의 환경 변 수 를 계승 하여 새로운 프로 세 스 를 만 듭 니 다. 하위 프로 세 스 가 끝 난 후에 부모 프로 세 스 를 되 돌려 줍 니 다.이것 은 셸 에서 가장 자주 사용 하 는 것 이다.exec()  1. sh 와 2. sh 는 같은 프로 세 스 번 호 를 인쇄 했 습 니 다. 같은 프로 세 스 입 니 다. 하위 프로 세 스 는 부모 프로 세 스 를 대체 합 니 다. 하위 프로 세 스 가 끝 났 을 때 프로 세 스 를 물 러 났 습 니 다. 원래 1. sh 에 속 하 는 after 부분 을 인쇄 하지 않 았 습 니 다.인증 은 셸 에서 exec ls 를 실행 하면 로그 인 을 종료 합 니 다.    source()  1. sh 와 2. sh 는 같은 프로 세 스 입 니 다. 서브루틴 의 명령 은 부모 프로그램의 명령 을 후속 으로 수행 합 니 다. 물론 서브루틴 이 환경 변 수 를 바 꾸 면 부모 프로그램 에 영향 을 줄 수 있 습 니 다. 같은 프로 세 스 때 문 입 니 다.

좋은 웹페이지 즐겨찾기