./ ,bash ,bash -c "", source, subshell vs childprocess

markyang92·2021년 5월 26일
1

shell-script

목록 보기
4/19
post-thumbnail

subshell vs childprocess

-subshellchildprocess비고
자동 inheritOX (부모가 export 해줘야함)
부모에게 영향XX부모에게 영향을 끼칠 수 있는 유일한 명령은
현재 쉘에서 source 'file' 뿐임
실행 명령bash -c "cmd"./ 'file'
bash 'file'
부모가 bg실행 시킨걸 wait로 기다릴 수 있는가?XO
  • ( )를 사용한 서브 쉘외부에 영향 X, exit는 서브쉘만 종료
  • { }를 사용한 인라인 그룹외부에 영향 줌, exit를 쓰면 현재 쉘 종료됨

Shell script에서 명령어의 위치

  • 쉘 스크립트에서 한 줄 한줄 명령이 실행되는 Working Directory$PWD이다.

서브 쉘 활용

  • ( ) 를 이용해 서브 쉘 생성 가능

1. subshell 동작

bash -c "cmd" : auto inherit

  • /bin/bash의 실행 및 옵션
/bin/bash [option] command

e.g.,
    /bin/bash -c "source oe-init-build-env"
option예제
-c "CMD"
  • bash -c "명령" 으로 명령을 실행 = child process, 서브 쉘로 동작
    = $ ( source "스크립트" ) 와 같음
  • export 없이 기존 쉘에게서 환경변수를 inherit 하지만, 내부 명령으로 기존 쉘에 영향 줄 수 없음


redirect, pipe는 subshell 실행

cat file.txt | while read line; do   # <--- | pipe로 실행하는 것은 하나의 서브쉘로 실행됨
    eval "$line" &    <-- bg
done  # <---- 여기 까지
wait <-- 서브쉘의 bg 는 wait로 기다리지 못함

2. 현재 shell에서 실행: source

source filename [args]

source filename [args]
  • 기능: 현재 라인에서 지정한 filename을 실행 후 적용됨
  • 주의 사항!!!
    • 쉘 '프롬프트'에서 실행 시키면, 현재 '쉘 프롬프트 쉘'기준으로 적용됨
      • 현재 쉘 프롬프트: zsh
      • 적용 시킬 file: bash
        • zshbash의 배열 index 접근 방식이 다르지만, 현재 쉘이 zshzsh대로 적용됨
# ======== temp.sh ============= #
#!/bin/bash
declare -a arr
arr+=(0)
arr+=(1)
arr+=(2)

echo ${arr[1]}
# ============================== #

$ ./temp.sh
1

$ source temp.sh   # zsh의 builtin command 'source'가 적용됨,
$ echo ${arr[1]}
0

bash 파일에서 source 사용

  • bash에서 source file 실행 시, 현재 bash 기준으로 '실행' 된 후 다음라인으로 넘어간다.
  • 즉, 현재 쉘에 영향을 끼치는 유일한 방법
  • source스크립트를 실행 = 현재 SHELL 프로세스 로 실행
  • ★ 유일하게 현재 쉘에 영향을 끼칠 수 있는 방법 ★
  • source 특징(bash built-in command)
    1. bashbuild-in command이다.
    2. 현재 Shell 프로세스에서 스크립트를 실행한다.
    3. 당연히 현재 Shell 프로세스에 영향을 끼친다.

  1. source현재 쉘 프로세스에서 실행하는 것이라 inherit이 당연히 되며, export 필요없음

    현재 쉘 프로세스에 다 영향을 끼침

서브쉘에서 source 사용

  • 서브쉘 에서 source스크립트를 실행 = 현재 SHELL 프로세스 로 실행, 하지만 현재 쉘 영향 X

  1. 서브쉘 내 source현재 쉘 프로세스에서 실행
  2. 서브쉘 내 영향이라 현재 쉘 프로세스에서 실행됨에도 불구하고 현재 프로세스에 영향을 주지 않음


3. child process

./, bash : auto inherit (X)

  • ./, bash스크립트를 실행 = child process 로 실행
  • child process 특징
    1. 부모 프로세스의 Variable이 Auto Inheritance X
    2. 부모 프로세스의 Variable을 사용하게 하려면 export 등록
    3. child process는 부모에게 영향 끼칠 수 없음

  1. child process에게 변수는 Auto Inheritance X


  1. 변수를 Inherit 하려면 미리 export

    child process부모 프로세스에게 영향 주지 못함!!!

child process는 wait로 기다림

FILE_LEN=$(cat file.txt | wc -l)
for ((i=1; i<=$FILE_LEN; i++)); do
    line=$(awk "NR==$i" file.txt)
    eval "$line" & <-- childprocess bg 실행
done
wait <- 기다림

$ pstree -ps PID: PID 기준으로 tree + pid + parent

  1. zshell 에서 pstree 실행

  1. zshell에서 python 스크립트 실행 -> 내부 subprocess.Popen("pstree -ps $$",shell=True,executable="bin/bash")으로 pstree실행


  1. bash shell 스크립트 동작
profile
pllpokko@alumni.kaist.ac.kr

1개의 댓글

comment-user-thumbnail
2023년 12월 11일

좋은 글 잘 봤습니다, 감사합니다 :)

답글 달기