bash 쉘 기준 명령어들의 종류를 살펴보면


ssaemo 파일을 실행한다고 가정할 때


sh ./ssaemo

. ./ssaemo

source ./ssaemo

변수명=변수값 ./ssaemo

(./ssaemo)


와 같은 명령어들을 사용한다.

무슨 차이일까?


cat ssaemo.sh

#!/usr/bin/env sh

ps


[ssaemo@interface ~]$ . ./ssaemo

  PID TTY          TIME CMD

18217 pts/0    00:00:00 bash

18335 pts/0    00:00:00 ps

[ssaemo@interface ~]$ source ./ssaemo

  PID TTY          TIME CMD

18217 pts/0    00:00:00 bash

18336 pts/0    00:00:00 ps

[ssaemo@interface ~]$ sh ./ssaemo

  PID TTY          TIME CMD

18217 pts/0    00:00:00 bash

18337 pts/0    00:00:00 sh

18338 pts/0    00:00:00 ps



. ./ssaemo

source ./ssaemo

위 두 명령어는 '현재 쉘'에서 쉘 스크립트를 실행한다.


> sh ./ssaemo

child process(sh)를 생성하여 해당 쉘에서 쉘 스크립트를 실행한다.

위 녹색 음영 처리된 프로세스가 그 쉘이다.


> 어떨 때 그 차이가 체감될까?

쉘 스크립트로 export SSAEMO="BYE"를 줬을 때

위 명령어는 현재 쉘의 환경변수에 선언이 된다.

그러나, 아래 명령어는 현재 쉘의 환경변수에는 영향을 끼치지 않는다.

그래서 source(또는 .) 명령어는 현재 쉘에 설정 파일을 즉시 include 해줄 때 사용한다고 한다.

또한 source 명령어는 'bash 쉘' 내부 명령어이다. 그러므로 bash 쉘에서만 사용할 수 있다.




변수명=변수값 test도 확인해보자!


[ssaemo@interface ~]$ cat ssaemo.c

#include <stdio.h>

#include <stdlib.h>


int main()

{

printf("%s\n", getenv("SSAEMO"));

return 0;

}

[ssaemo@interface ~]$ gcc -o ssaemo ssaemo.c

[ssaemo@interface ~]$ SSAEMO="HELLO" ./ssaemo

HELLO

[ssaemo@interface ~]$ export | grep SSAEMO

[ssaemo@interface ~]$ 


./test 와의 차이는

child process에 환경변수 SSAEMO를 선언하고 ./test 바이너리 파일을 실행한다는 것임을 확인할 수 있다.




그리고 스크립트 파일의 경우 보통 파일 첫 줄에 다음 내용을 입력한다.


#!/bin/sh

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/env sh

#!/usr/bin/env bash

#!/usr/bin/env python


앞에 "#!"가 있으면 "이 파일을 실행할 때 다음 프로그램(ex:/bin/sh)을 사용하라"는 의미이다.

그럼 /bin/sh와 /usr/bin/env sh의 차이는?

전자는 절대 경로로써 dependency(의존성)이 발생할 수가 있다.

위 파일을 만든 후, 다른 환경에서 해당 파일 실행 시 sh 파일이 /bin 디렉토리에 없을 수도 있다.

하지만, 후자는 sh 파일의 경로가 다르더라도, 그 경로를 찾아서 실행할 수 있기 때문에 그런 문제를 해결해준다.

쉘에 /usr/bin/env sh를 입력하면 /bin/sh와 같이 쉘이 실행되는 것을 확인할 수 있다.


일단 필자가 테스트해봤을 때, 누락되거나 잘못 입력해도 문제가 생기는 경우는 아직 발견하지 못했다.

그래도 의미는 알아두자!

#!/bin/sh 또는 #!/usr/bin/python 라인은

맨 위에 녹색 음영처리된 방식으로 파일을 실행할 때

영향을 미친다.

위 방법으로 실행할 때

chmod +x [binary]를 통해 파일에 실행권한을 줘야한다.


source ~~와 . ~~는 같다.

sh ~~와 ./~~는 다르다.

뭐가 다르냐? 미묘한 차이다.

sh는 자식 쉘을 만든 후, 프로그램을 실행한다.

./~~는 프로그램 실행과 동시에 자식 쉘이 만들어진다.

다시 말해 sh는 sh;./~~와 같다.

필자가 잘못 이해하고 있는 것일 수도 있다.

그런데 굳이.. 중요한 정보는 아니라서..



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/