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;./~~와 같다.
필자가 잘못 이해하고 있는 것일 수도 있다.
그런데 굳이.. 중요한 정보는 아니라서..
'Language' 카테고리의 다른 글
binary data 처리 이슈 (vs string data) (0) | 2017.11.26 |
---|---|
Windows API - CreateProcess() Function (1) | 2015.12.02 |
QT 'Run Qmake' Error (Linux) (0) | 2015.11.23 |
[git] 간단 사용법 / 그외 커맨드들 (0) | 2015.11.21 |
LP*STR, _tmain의 의미 / 32bit,64bit 자료형의 크기 정리 (0) | 2015.11.17 |
WRITTEN BY
- hojongs
블로그 옮겼습니다 https://hojongs.github.io/