셸 스 크 립 트 에서 다른 스 크 립 트 를 호출 하 는 세 가지 다른 방법 (fork, exec, source)
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 는 같은 프로 세 스 입 니 다. 서브루틴 의 명령 은 부모 프로그램의 명령 을 후속 으로 수행 합 니 다. 물론 서브루틴 이 환경 변 수 를 바 꾸 면 부모 프로그램 에 영향 을 줄 수 있 습 니 다. 같은 프로 세 스 때 문 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.