Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

#!/bin/bash 에서 #!는 무슨 뜻인가?

8,962 views
Skip to first unread message

Jongseon SHIN

unread,
Aug 21, 2004, 10:21:38 PM8/21/04
to
적당한 그룹에 올리는 것인지 모르겠습니다.

셸스크립트 첫머리에 있는 #!/bin/bash 의 #!는 무슨 뜻인가요?
#!는 주석으로 처리되지 않는 건가요? 스크립트 중간에 #!가 들
어가거나, 스크립트 해석기 이외의 다른 명령어를 써 넣으면,
어떻게 처리하나요?

구글로 잠시 찾아보니 #!/bin/sh 는 커널이 처리한다고 하는데,
커널이 처리하면 뭐가 다른거죠?

----
리눅스걸음마 SHIN


JanDiInHyeong

unread,
Aug 22, 2004, 2:57:03 AM8/22/04
to
Jongseon SHIN 쓴 글:

정확한 것은 아니고 저의 추측이지만
일반 텍스트 파일에 실행권한이 주어져 있고 맨 첫줄에 #! 이 있으면 그 뒤에
나오는 스크립트 해석하는 프로그램으로 실행되는 것 같습니다.

문법이 bash 이면 #!/usr/bash이고 perl 이면 #!/usr/perl 을 이용하여 스크
립트를 실행하게 된다는 것이지요.

-- http://www.byungju.com --

Chong-Dae Park

unread,
Aug 23, 2004, 8:37:14 AM8/23/04
to
JanDiInHyeong <a...@babo.net> wrote:
> 정확한 것은 아니고 저의 추측이지만
> 일반 텍스트 파일에 실행권한이 주어져 있고 맨 첫줄에 #! 이 있으면 그 뒤에
> 나오는 스크립트 해석하는 프로그램으로 실행되는 것 같습니다.

맞는 추측입니다.

실행 bit가 켜 있는 FILE이라는 파일이 있을 때,

1. 첫 줄이 "#!프로그램" 식이라면 "프로그램 FILE" 식으로 불러준 것과
마찬가지 효과를 가집니다. (프로그램 내에서 argc/argv 값은 다릅니다만..)

첫 줄에 #!/bin/cat 을 넣어보세요.

적당한 인자를 줄 수도 있습니다.
#!/bin/csh -f
식이라면 /bin/csh -f FILE 이 불린 셈입니다.

2. 첫 줄이 # 로 시작되면 csh을 불러줍니다.

3. 그 이외의 경우엔 sh을 불러줍니다.

--
박종대
--
. o . o . o . . o o . . . o . G a m e
. . o . o o o . o . o o . . o o f
o o o . o . . o o o o . o o o L i f e

뉴스그룹

unread,
Sep 2, 2004, 9:37:15 PM9/2/04
to

#! 은 스크립트의 제일 앞에서 이 파일이 어떤 명령어 해석기의 명령어
집합인지를 시스템에게 알려주는 역할을 합니다. #! 은 두 바이트 [1] 의 "매직
넘버"(magic number)로서, 실행 가능한 쉘 스크립트라는 것을 나타내는 특별한
표시자입니다(man magic을 하면 재미있는 주제의 이야기들을 볼 수 있습니다). #!
바로 뒤에 나오는 것은 경로명으로, 스크립트에 들어있는 명령어들을 해석할
프로그램의 위치를 나타내는데 그 프로그램이 쉘인지, 프로그램 언어인지,
유틸리티인지를 나타냅니다. 이 명령어 해석기가 주석은 무시하면서 스크립트의
첫 번째 줄부터 명령어들을 실행시킵니다.

#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f


각각의 줄은 기본 쉘인 /bin/sh이나 기본쉘(리눅스에서는 bash), 혹은 다른
명령어 해석기를 부르고 있습니다. 거의 대부분의 상업용 유닉스 변종에서 기본
본쉘인 #!/bin/sh을 쓰면 비록 Bash 만 가지고 있는 몇몇 기능들을 못 쓰게
되겠지만 리눅스가 아닌 다른 머신에 쉽게 이식(port)할 수 있게 해
줍니다(이렇게 작성된 스크립트는 POSIX [4] sh 표준을 따르게 됩니다.

"#!" 뒤에 나오는 경로는 정확해야 합니다. 만약 이를 틀리게 적는다면
스크립트를 돌렸을 때 거의 대부분 "Command not found"라는 에러 메세지만 보게
될 것입니다.스크립트에서 내부 쉘 지시자를 안 쓰고 일반적인 시스템 명령들만
쓴다면 #!는 안 써도 괜찮습니다. #!/bin/sh이 리눅스에서 기본 쉘 해석기인
/bin/bash을 부르고 있는 것에 주의하십시오.#!/bin/rm
# 자기 자신을 지우는 스크립트.

# 이 스크립트를 실행시키면 이 파일이 지워지는 것 말고는 아무일도 안
생깁니다.

WHATEVER=65

echo "확신하건데, 이 부분은 절대 출력되지 않을 겁니다."

exit $WHATEVER # 여기서 exit로 빠져 나가지 못하니까 뭐라고 적든 상관없겠죠.
재미있는게 또 있는데, README 파일의 시작 부분에 #!/bin/more 라고 적고 실행
퍼미션을 주면, 자기 스스로 내용을 보여주는 문서 파일이 됩니다.자료 인용)
고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 -
kldp.org"Jongseon SHIN" <pio...@Mhanmail.net> wrote in message
news:cg8vvd$p1m$1...@news.kreonet.re.kr...

0 new messages