셸 과 명령 의 실행

3313 단어
셸 에서 실 행 된 명령 3 가지:
1. 내장 명령 (빌 트 인)
셸 이 이 명령 을 실행 할 때 새 프로 세 스 를 파생 시 키 지 않 고 셸 에서 직접 실행 합 니 다.예 를 들 어 read, set, export 는 모두 내 장 된 명령 입 니 다. 이 명령 들 은 help command 로 도움말 정 보 를 확인 해 야 합 니 다.
2. 외부 명령
외부 명령 은 보통 실행 가능 한 바 이 너 리 파일 입 니 다. 셸 은 이 를 실행 할 때 새 프로 세 스 (이것 은 키 셸) 를 fork 하고 exec 시리즈 함수 로 실행 합 니 다. 이때 하위 셸 의 환경 은 명령 의 환경 으로 대 체 됩 니 다.
3. 셸 스 크 립 트
셸 스 크 립 트 를 실행 할 때 셸 역시 먼저 fork 파생 서브 프로 세 스 를 실행 한 다음 exec 를 사용 하여 스 크 립 트 설명 프로그램 을 호출 합 니 다.스 크 립 트 해석 기 는 bash, cshell, perl, python 등 이 많 습 니 다.조 정 된 해석 프로그램 이 현재 셸 과 같은 셸 이 라면 현재 셸 의 하위 셸 입 니 다. 스 크 립 트 의 명령 은 모두 하위 셸 에서 실행 되 며 부모 셸 의 환경 에 영향 을 주지 않 습 니 다.
() 와 {} 의 명령 그룹:
() 와 {} 에 명령 어 를 내장 할 수 있 습 니 다.() 의 명령 은 키 셸 에서 실 행 됩 니 다. 명령 실행 결 과 는 현재 셸 에 영향 을 주지 않 습 니 다.주의해 야 할 것 은 현재 셸 프로 세 스 를 대표 하 는 PID 입 니 다. 하위 셸 프로 세 스 의 PID 가 아 닙 니 다.
{} 의 명령 은 현재 셸 에서 실 행 됩 니 다. 명령 실행 결 과 는 현재 환경 에 영향 을 줄 수 있 습 니 다.
백그라운드 실행 과 비동기 실행
셸 스 크 립 트 에서 명령 을 백 엔 드 에 넣 고 실행 합 니 다. 이 명령 은 현재 셸 의 실행 과 병행 합 니 다. 현재 셸 은 키 셸 을 파생 시 켜 이 백 엔 드 명령 을 실행 하고 자신 은 계속 아래로 실행 합 니 다. 서로 의존 하고 기다 리 는 관계 가 없 기 때문에 비동기 적 인 실행 방식 입 니 다.다음 코드 는 이 점 을 설명 할 수 있다.
#!/bin/bash

LOG=$0.log

COMMAND1="sleep 100"

echo "Logging PIDs background commands for script: $0" >> "$LOG"

echo >> "$LOG"

echo -n "PID of \"$COMMAND1\": " >> "$LOG"

${COMMAND1} &

echo $! >> "$LOG"

위의 스 크 립 트 에서 sleep 100 명령 은 배경 에 넣 어 실 행 됩 니 다. 현재 셸 은 아래 echo 문 구 를 계속 실행 합 니 다. sleep 이 실 행 된 후에 야 아래 echo 를 실행 하지 않 습 니 다. 이 점 은 $0. log 파일 을 보면 검 증 될 수 있 습 니 다.
명령 바 꾸 기
command 는 command 명령 의 출력 결 과 를 현재 명령 줄 로 대체 합 니 다.command 는 하위 셸 에서 실 행 됩 니 다. 결 과 는 현재 셸 에 영향 을 주지 않 습 니 다.다음 코드 비교:
#!/bin/bash

pwd

dir=`cd /tmp; pwd`

echo $dir

pwd

출력:
$ ./substitute.sh
/home/beyes/shell
/tmp
/home/beyes/shell

현재 셸 이 있 는 디 렉 터 리 는 변경 되 지 않 았 습 니 다.
파이프
bash 에 게 (dash, ash 등 대부분의 셸 도 마찬가지) 파이프 의 명령 은 하위 셸 에 놓 여 실행 되 기 때문에 다음 명령 처럼 원 하 는 결 과 를 얻 지 못 합 니 다.
command | read var

파이프 에서 왼쪽 명령 의 표준 출력 은 오른쪽 명령 의 표준 으로 입력 됩 니 다.하지만 위 명령 의 command 실행 결 과 는 var 에 의 해 잡 힐 수 있 습 니까?다음 예 를 보십시오.
#!/bin/bash

a="hello world"

echo "$a"| read var

echo $var

exit 0

실행 출력 이 비어 있 습 니 다.'hello World' 문자열 이 var 에 잡 히 기 를 바 랐 지만 사실은 그렇지 않 았 다.파이프 의 명령 은 하위 셸 에 놓 여 실행 되 기 때문에 var 에서 얻 은 값 은 현재 셸 에 전달 할 수 없 기 때문에 출력 을 비 워 야 합 니 다.
그러면 우 리 는 위의 코드 를 바 꾸 어 이 점 을 증명 합 니 다.
#!/bin/bash

a="hello world"

echo "$a"| (read var; echo "In subshell:$var")

echo "In parent shell: $var"


exit 0

출력 실행:
beyes@debian:~/shell$ ./var.sh
In subshell:hello world
In parent shell:

자, 이 때 는 정확하게 출력 할 수 있 습 니 다.위 에서 말 한 바 와 같이 괄호 안에 있 는 명령 그룹 은 모두 같은 키 셸 에 속 하기 때문에 괄호 안에 있 는 $var 는 하위 셸 에 속 합 니 다. 괄호 안에 입력 하면 정상 적 인 문자열 을 볼 수 있 습 니 다.괄호 이외 의 $var 는 부모 셸 에 속 하기 때문에 문자열 을 얻 을 수 없습니다. 하위 셸 의 변 수 는 C 언어의 국부 변수 와 같 습 니 다.
그러나 korn 셸 이 command | read var 를 실현 할 수 있 는 것 은 셸 의 디자인 이 다 르 기 때 문 입 니 다. korn 셸 에서 파이프 의 명령 은 현재 셸 에서 실행 되 기 때 문 입 니 다.스 크 립 트 의 호환성 을 유지 하기 위해 서 는 이런 방법 을 피해 야 한다.
다음으로 전송:
셸 과 명령 의 실행

좋은 웹페이지 즐겨찾기