맨위로가기

셔뱅

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

셔뱅(Shebang)은 스크립트나 데이터 파일을 실행 파일처럼 사용할 수 있도록 해주는 인터프리터 지시자이다. 셔뱅은 스크립트 파일의 첫 두 바이트인 `#!`로 시작하며, 그 뒤에 인터프리터의 절대 경로와 옵션을 지정한다. 리눅스와 미닉스에서는 스크립트도 인터프리터로 사용할 수 있지만, 솔라리스와 macOS에서는 실행 가능한 바이너리만 가능하다. 셔뱅은 스크립트의 구현 세부 사항을 숨기고, 다양한 인터프리터를 사용할 수 있게 해주지만, 이식성 문제와 시스템별 명령 인수 해석 방식의 차이, 캐리지 리턴 문자로 인한 문제 등이 발생할 수 있다. 셔뱅은 유닉스에서 1980년에 처음 도입되었으며, 1989년 12월까지 사용되었다.

더 읽어볼만한 페이지

  • 유닉스 - 유닉스 시간
    유닉스 시간은 1970년 1월 1일 00:00:00 UTC부터 경과된 초를 나타내는 시스템으로, 컴퓨터 시스템에서 시간 저장 및 처리에 널리 사용되며 32비트 정수 표현 시 2038년 문제를 야기할 수 있고 64비트 정수로 해결 가능하며, 다양한 시스템에서 타임스탬프로 활용되지만 윤초 처리 차이로 UTC 시간과 완벽히 일치하지는 않는다.
  • 유닉스 - 유닉스 계열
    유닉스 계열은 유닉스 운영체제의 특징과 설계를 공유하는 운영체제들을 지칭하며, 유전적, 상표, 기능적 유닉스로 분류되고 macOS는 상표 유닉스이자 유전적 유닉스에 해당하며 리눅스는 기능적 유닉스의 대표적인 예이다.
셔뱅
기본 정보
"유닉스 계열 운영 체제에서 스크립트 파일을 실행하는 데 사용되는 Shebang"
개요
설명shebang (#! ASCII 텍스트 파일의 처음 두 글자)은 텍스트 파일이 인터프리터를 통해 실행 가능한 프로그램으로 취급되어야 함을 나타내는 지시문이다.
사용 목적유닉스 계열 운영 체제에서 스크립트 파일을 실행하는 데 사용
위치텍스트 파일의 첫 번째 줄에 위치
작동 방식운영 체제는 shebang에 지정된 인터프리터를 사용하여 스크립트를 실행한다.
다른 이름hashbang
pound-bang
bang path
예시
Bourne shell을 사용하여 스크립트 실행#!/bin/sh
Bash를 사용하여 스크립트 실행#!/bin/bash
Perl을 사용하여 스크립트 실행#!/usr/bin/perl
Python을 사용하여 스크립트 실행#!/usr/bin/env python3
Ruby를 사용하여 스크립트 실행#!/usr/bin/ruby
Scheme을 사용하여 스크립트 실행#!/usr/bin/scheme --script
역사
기원1980년대 초 Dennis Ritchie에 의해 System V Release 4 (SVR4)에서 도입
초기 이름hashbang
목적bin 프로그램을 스크립트처럼 실행할 수 있도록 하기 위함
상세 정보
기능스크립트를 실행할 인터프리터를 지정
장점스크립트 실행 시 인터프리터를 명시적으로 지정할 필요가 없음
단점shebang 라인이 없거나 잘못된 경우 스크립트 실행 실패
보안 문제사용자가 shebang 라인을 수정하여 악성 코드를 실행할 가능성 존재
실행 권한스크립트 파일에 실행 권한이 있어야 함
WindowsWindows에서는 shebang이 기본적으로 지원되지 않음. Cygwin 등의 환경에서는 사용 가능.

2. 문법

셔뱅 인터프리터 지시자의 형태는 다음과 같다.[43]

#!''interpreter'' [''optional-arg'']

여기서 ''interpreter''는 실행 프로그램의 절대 경로여야 한다. (인터프리터 프로그램이 스크립트인 경우 셔뱅도 함께 포함해야 함) ''optional-arg''는 선택 사항으로서 넣지 않아도 되며, 넣을 경우 하나의 변수여야 한다. (이식성을 이유로 어떠한 공백도 포함하지 않아야 함) #! 다음의 공백은 선택 사항이다.[37]

리눅스에서 ''해석기''로 지정된 파일은 실행 권한이 있고 기본 실행 파일, binfmt_misc 메커니즘을 통해 해석기가 등록된 모든 종류의 파일, 혹은 셔뱅으로 시작하는 다른 스크립트인 경우 실행할 수 있다. 리눅스와 미닉스에서 해석기는 스크립트일 수도 있다. 셔뱅과 래퍼의 체인은 역순으로 발견된 스크립트를 매개변수로 가져오는 직접 실행 가능한 파일을 생성한다.

솔라리스와 다윈 기반 운영 체제 (예: macOS)에서 ''해석기''로 지정된 파일은 실행 가능한 바이너리여야 하며, 스크립트 자체일 수 없다.[10]

3. 예

셔뱅 줄의 예는 다음과 같다:[11]


  • `#!/bin/sh` — 본 셸 또는 호환 셸을 이용하여 파일을 실행한다.
  • `#!/bin/csh -f` — C 셸을 이용하여 파일을 실행하고, 시작 시 사용자의 .cshrc 파일의 실행을 방지한다.
  • `#!/usr/bin/perl -T` — 테인트 검사 옵션으로 을 이용하여 실행한다.
  • `#!/bin/bash` - 파일을 Bash 셸을 사용하여 실행한다.
  • `#!/usr/bin/pwsh` - 파일을 PowerShell을 사용하여 실행한다.
  • `#!/usr/bin/env python3` - env 프로그램 검색 경로를 사용하여 Python 인터프리터로 실행한다.
  • `#!/bin/false` - 아무것도 하지 않지만, 실패를 나타내는 0이 아닌 종료 상태를 반환한다.


셔뱅 라인은 인터프리터에 전달되는 특정 옵션을 포함할 수 있다. 그러나 옵션의 구문 분석 동작은 구현에 따라 다르므로, 이식성을 위해 임베디드 공백 없이 하나의 옵션만 지정해야 한다.[11]

경로를 직접 지정하는 본 셸의 예시는 다음과 같다.

```text

#!/bin/sh

echo 'Hello world!'

```

env 명령어를 사용한 루비 언어의 인터프리터 `ruby`의 예시는 다음과 같다.

```text

#!/usr/bin/env ruby

puts 'Hello world!'

4. 목적

인터프리터 지시자는 스크립트와 데이터 파일을 명령어로 사용할 수 있게 하여, 명령 줄에서 스크립트 앞에 인터프리터를 붙일 필요 없이 사용자 및 다른 프로그램으로부터 구현 세부 사항을 숨긴다.[33] 예를 들어 `#!/bin/sh -x`로 시작하는 스크립트는 `some/path/to/foo bar baz`와 같이 호출될 수 있다. 이 경우 `/bin/sh`가 `-x`, `some/path/to/foo`, `bar`, `baz` 매개변수와 함께 호출된다.

인터프리터 지시어 방식을 사용하면 사용자가 전역 시스템 수준에서 알 수 없는 인터프리터를 사용하고 관리자 권한 없이도 사용할 수 있다. 또한, 파일 확장자 네임스페이스를 과부하 없이 특정 인터프리터를 선택할 수 있으며, 다른 프로그램에서 호출 구문을 변경하지 않고 스크립트의 구현 언어를 변경할 수 있다.[33]

파일 시작 부분의 셔뱅은 운영 체제의 `execve` 시스템 호출 ( `exec` 참조)을 처리하는 루틴 중의 프로그램 로더가 인식한다.[33] 셔뱅의 참조 대상은 실행 가능한 바이너리여야 하며, 셔뱅 행이 있는 스크립트여서는 안 된다. 셔뱅 행의 최대 문자 수, 지정 가능한 인수의 수 등은 환경 의존적이다.[32]

`env`를 사용한 트릭은 PATH 환경 변수에 의존하며, 부모 프로세스가 독자적으로 PATH를 설정한 경우 예상치 못한 동작을 할 수 있다. 래리 월의 metaconfig에는 셔뱅이 없는 시스템을 감지하여 스크립트 시작 부분의 `#!/bin/sh`를 `: use /bin/sh`로 치환하는 기능이 있었다.[34] ELF에서는 프로그램 헤더의 `INTERP`형 항목에 인터프리터를 기술하여 동적 링크 라이브러리의 경로명을 설정한다. FreeBSD의 커널 바이너리는 인터프리터로 `/red/herring`을 지정하고 있다.[35]

5. 이식성

셔뱅은 시스템 실행 파일에 대한 절대 경로를 지정해야 하므로, 표준이 아닌 파일 시스템 레이아웃을 가진 시스템에서는 문제가 발생할 수 있다. GNU의 /usr/bin/env영어 스크립트를 사용하여 이 제한을 우회할 수 있다. (예: #!/usr/bin/env sh영어) 하지만, 명령 인수 해석 방식이 시스템마다 다를 수 있으므로 주의해야 한다. (일부 시스템은 인수를 분할하지 않음)[18] 또한, 캐리지 리턴 문자가 셔뱅 줄 뒤에 포함되면 오류가 발생할 수 있다.[21]

```wikitable

셔뱅 이식성 문제 및 해결 방법
문제점해결 방법추가 설명
시스템 실행 파일의 절대 경로 지정 필요/usr/bin/env영어 스크립트 사용 (예: #!/usr/bin/env sh영어)env영어 유틸리티의 경로(/usr/bin/env영어)가 일반적으로 사용되므로 대부분 작동하지만, 일부 시스템에서는 문제가 발생할 수 있다.
시스템마다 다른 명령 인수 해석 방식(해결 방법 없음)일부 시스템은 인수를 분할하지 않으므로 주의가 필요하다.[18]
셔뱅 줄 뒤의 캐리지 리턴 문자(해결 방법 없음)캐리지 리턴 문자는 인터프리터 명령의 일부로 해석되어 오류를 발생시킨다.[21]


5. 1. 프로그램 위치

셔뱅은 시스템 실행 파일에 대한 절대 경로(또는 현재 작업 디렉터리에 대한 상대 경로)를 지정해야 한다.[13] 이는 표준이 아닌 파일 시스템 레이아웃을 가진 시스템에서 문제를 일으킬 수 있다. 시스템에 비교적 표준 경로가 있는 경우에도 동일한 운영 체제의 변형이 원하는 인터프리터의 다른 위치를 가질 수 있다. 예를 들어, 파이썬은 일반 사용자가 설치한 경우 '/usr/bin/python3', '/usr/local/bin/python3' 또는 '/home/username/bin/python3'과 같은 위치에 있을 수 있다.

유사한 문제는 POSIX 셸에도 존재한다. POSIX는 이름이 'sh'일 것을 요구했지만 경로는 의무화하지 않았기 때문이다.[13] 일반적인 값은 /bin/sh이지만, 솔라리스와 같은 일부 시스템은 POSIX 호환 셸을 '/usr/xpg4/bin/sh'에 가지고 있다. 많은 리눅스 시스템에서 '/bin/sh'는 Bourne Again 셸(BASH)인 '/bin/bash'에 대한 하드 링크 또는 심볼릭 링크이다. 셔뱅이 'sh'를 가리키면서 bash 관련 구문을 사용하는 것도 이식성이 없다.[14]

이 때문에 스크립트를 한 컴퓨터에서 다른 컴퓨터로 복사한 후 셔뱅 줄을 편집해야 하는 경우가 있다.[15] 이는 스크립트에 코딩된 경로가 새 시스템에 적용되지 않을 수 있기 때문이며, 인터프리터의 배치에 대한 과거 관례의 일관성에 따라 달라진다. 이러한 이유와 POSIX가 경로 이름을 표준화하지 않기 때문에, POSIX는 해당 기능을 표준화하지 않는다.[15] GNU Autoconf 도구는 매크로 AC_SYS_INTERPRETER를 사용하여 시스템 지원을 테스트할 수 있다.[16]

5. 2. 문자 해석

일부 시스템은 명령 인수를 분할하지 않는다.[18] 예를 들어, 스크립트의 첫 줄이 `#!/usr/bin/env python3 -c`일 때, 첫 공백 뒤의 모든 텍스트는 단일 인수로 처리되어 `python3 -c`는 두 개의 인수가 아닌 `/usr/bin/env`에 하나의 인수로 전달된다. Cygwin도 이와 같이 작동한다.

FreeBSD 6.0(2005)은 셔뱅 읽기 동작을 분할하지 않도록 변경하면서 `env`에 `-S` 옵션을 도입하여 문자열 자체를 분할하도록 지시한다.[19] coreutils 8.30(2018) 이후의 GNU `env` 유틸리티도 이 기능을 포함한다.[20]

또 다른 문제는 셔뱅 줄 바로 뒤에 캐리지 리턴 문자가 포함된 스크립트의 경우인데, 이는 Microsoft Windows와 같이 DOS 줄 바꿈을 사용하는 시스템에서 편집한 결과일 수 있다. 일부 시스템은 캐리지 리턴 문자를 인터프리터 명령의 일부로 해석하여 오류 메시지를 생성한다.[21]

6. 매직 넘버

셔뱅은 실행 파일 내의 매직 넘버의 사람이 읽을 수 있는 인스턴스이며, 매직 바이트 문자열은 0x23 0x21이고, 이는 #!의 아스키의 두 글자 인코딩이다.[11] 이 매직 넘버는 "exec" 계열 함수에 의해 감지되며, 이 함수는 파일이 스크립트인지 실행 바이너리인지 판단한다. 셔뱅이 있으면 스크립트 언어의 인터프리터인 지정된 실행 파일이 실행된다.

셔뱅 문자는 현재 유닉스 계열 시스템의 스크립트 및 기타 텍스트 파일에 일반적으로 사용되는 UTF-8을 포함한 확장 아스키 인코딩에서 동일한 두 바이트로 표현된다. 그러나 UTF-8 파일은 선택적 바이트 순서 마크 (BOM)로 시작될 수 있다. "exec" 함수가 바이트 0x23 및 0x21을 명시적으로 감지하는 경우, 셔뱅 앞에 BOM (0xEF 0xBB 0xBF)이 있으면 스크립트 인터프리터가 실행되지 않는다.[23]

파일의 시작 부분에 있는 시뱅을 인식하는 것은 운영 체제 (OS)의 `execve` 시스템 호출 (`exec` 참조)을 처리하는 루틴 중의 프로그램 로더이다.[33] 파일의 시작 부분이 바이트 순서 표시가 있는 유니코드 형식의 파일의 경우에는 동작하지 않는다. 이는 바이트 순서 표시 때문에 OS의 프로그램 로더가 시뱅을 인식할 수 없기 때문이다.

시뱅의 참조 대상은 실행 가능한 바이너리여야 하며, (시뱅 행이 있는) 스크립트여서는 안 된다. 셔뱅 행의 최대 문자 수, 지정 가능한 인수의 수 등은 환경 의존적이다. 또한, 이를 벗어난 경우의 동작도 환경 의존적이다. 특히 여러 개의 인수를 부여한 경우에 어떻게 처리될지는 제각각(정상적으로 처리, 두 번째 이후는 무시, 공백이 들어간 하나의 인수로 처리)이므로 주의가 필요하다.[32]

env를 사용한 트릭은 PATH 환경 변수에 의존한다. 부모 프로세스가 독자적으로 PATH를 설정한 경우, 예상치 못한 동작을 할 가능성이 있다. `ruby` 인터프리터의 경우에는 `-x` 옵션을 이용한 다음과 같은 셸 스크립트로 위장하는 트릭을 사용하는 것이 좋다.

```sh

#!/bin/sh

# -*- ruby -*-

exec ruby -x "$0" "$@"

#!ruby

puts 'Hello world!'

```

래리 월의 metaconfig에는, 시뱅을 갖지 않는 시스템을 감지하여 스크립트의 시작 부분의 `#!/bin/sh`를 `: use /bin/sh`로 치환하는 기능이 있었다.[34]

ELF에서는 유사한 기능으로 프로그램 헤더의 `INTERP`형 항목에 인터프리터를 기술할 수 있다. 여기에는 실행 가능한 바이너리가 사용하는 동적 링크 라이브러리의 경로명을 설정한다. OS는 실행 가능한 바이너리와 함께 인터프리터로 지정된 동적 링크 라이브러리도 로드하여 동적 링크의 처리를 수행한다. FreeBSD의 커널 바이너리는 인터프리터가 커널에서는 사용되지 않는다는 점을 이용하여, 인터프리터로 `/red/herring`을 지정하고 있다.[35]

7. 어원

'''셔뱅'''(shebang)이라는 이름은 ''SHArp bang'' 또는 ''haSH bang''이라는 두 문자를 가리키는 일반적인 유닉스 이름의 부정확한 축약에서 유래되었을 가능성이 있다.[24] ''shebang''에서 ''sh''가 유래되었다는 또 다른 이론은, shebang과 함께 호출되는 경우가 많은 기본 셸 ''sh''에서 유래되었다는 것이다.[24] 이 용어는 1989년 12월까지 사용되었으며,[25] 아마 그 이전부터 사용되었을 것이다.

8. 역사

데니스 리치는 에디션 7과 8 사이의 벨 연구소에서 셔뱅을 처음 도입하였다. 또한 BSD 릴리스에도 추가되었으며, 버클리 컴퓨터 과학 연구소(2.8BSD에 존재[26] 및 4.2BSD에서 기본적으로 활성화됨)에서 제공되었다. AT&T 벨 연구소의 Edition 8 Unix 및 이후 에디션은 일반에 공개되지 않았기 때문에 이 기능이 처음으로 널리 알려진 것은 BSD였다.

데니스 리치는 1980년 1월, 버전 8 유닉스를 위해 인터프리터 지시어에 대한 커널 지원을 도입했으며, 다음과 같은 설명을 덧붙였다:[26]

:uucp Thu Jan 10 01:37:58 1980

:>From dmr Thu Jan 10 04:25:49 1980 remote from research

:시스템이 변경되어 실행되는 파일이 매직 문자 #!로 시작하면, 나머지 줄은 실행되는 파일의 인터프리터 이름으로 이해된다. 이전에는 (그리고 사실 지금도) 셸이 이 작업의 대부분을 수행했다. 텍스트 파일의 이름이 명령으로 입력되면 실행 모드로 텍스트 파일 자체를 자동으로 실행했다. 이 기능을 시스템에 추가하면 다음과 같은 이점이 있다.

:#) 셸 스크립트를 실제 실행 파일과 더 가깝게 만들어 'exec'의 대상이 될 수 있다.

:#) 이러한 명령이 실행되는 동안 'ps'를 실행하면 'sh' 대신 실제 이름이 나타난다. 마찬가지로, 어카운팅도 실제 이름을 기준으로 수행된다.

:#) 셸 스크립트가 set-user-ID를 가질 수 있다.

:#) 대체 셸을 더 쉽게 사용할 수 있다. 예를 들어, 버클리 csh를 선호하는 경우 파일을 해석할 셸에 대한 질문이 없다.

:#) 다른 인터프리터가 더 원활하게 통합될 수 있다.

:이 훌륭한 기회를 활용하려면,

:#! /bin/sh

:셸 스크립트의 첫 번째 줄의 왼쪽 여백에 입력하십시오. ! 뒤의 공백은 괜찮다. 전체 경로 이름을 사용하십시오(검색은 수행되지 않음). 현재 전체 줄은 16자로 제한되어 있지만 이 제한은 늘어날 것이다.

8. 1. 이름 없는 셸 스크립트 기능

이 기능의 제작자는 이름을 붙이지 않았다.[29]

데니스 M. 리치/Dennis M. Ritchie영어의 이메일에 따르면, 이 기능에 대한 특별한 이름은 없었다. 리치는 버클리 유닉스 콘퍼런스에서 아이디어를 얻어 처음으로 기능을 설치했을 가능성이 있지만, 아이디어 자체는 다른 곳에서 얻은 것이라고 밝혔다. 이름에 대해서는 "hash-bang"과 같이 설명적인 이름을 사용했을 수 있지만, 특별한 애칭을 사용했는지는 기억나지 않는다고 하였다.[29]

인터프리터 지시자에 대한 커널 지원은 다른 버전의 유닉스로 확산되었으며, 현대적인 구현의 하나는 리눅스 커널 소스 코드의 ''fs/binfmt_script.c''에서 볼 수 있다.[30]

이 메커니즘을 통해 스크립트는 완전한 시스템 프로그램으로, 심지어 다른 스크립트의 인터프리터로도 일반적인 컴파일된 프로그램과 거의 모든 컨텍스트에서 사용할 수 있다. 하지만 일부 초기 버전의 커널 지원은 인터프리터 지시어의 길이를 대략 32자로 제한했으며(처음 구현 시에는 16자), 지시어에서 인터프리터 이름과 매개변수를 분리하지 못하거나 다른 특이한 사항이 있었다. 또한, 일부 최신 시스템에서는 보안을 위해 전체 메커니즘을 제한하거나 비활성화할 수 있다(예: 많은 시스템에서 스크립트에 대한 set-user-id 지원이 비활성화됨).

''#!'' 매직 넘버에 대한 완전한 커널 지원이 있는 시스템에서도 인터프리터 지시어가 없는 일부 스크립트는(일반적으로 실행 권한이 필요함) 많은 최신 파생 제품에 여전히 존재하는 본 셸의 레거시 스크립트 처리로 인해 실행될 수 있다. 그러면 스크립트는 사용자의 기본 셸에 의해 해석된다.

9. 추가 정보

파일의 시작 부분에 있는 시뱅을 인식하는 것은 운영 체제(OS)의 `execve` 시스템 호출(`` 참조)을 처리하는 프로그램 로더이다.[33] 파일 시작 부분이 바이트 순서 표시가 있는 유니코드 형식 파일인 경우에는 바이트 순서 표시 때문에 OS의 프로그램 로더가 시뱅을 인식할 수 없어 동작하지 않는다. 시뱅의 참조 대상은 실행 가능한 바이너리여야 하며, (시뱅 행이 있는) 스크립트여서는 안 된다.

env를 사용한 트릭은 PATH 환경 변수에 의존하므로, 부모 프로세스가 독자적으로 PATH를 설정한 경우 예상치 못한 동작을 할 가능성이 있어 주의해야 한다.[32] 래리 월의 metaconfig에는 시뱅을 갖지 않는 시스템을 감지하여 스크립트 시작 부분의 `#!/bin/sh`를 `: use /bin/sh`로 치환하는 기능이 있었다.[34]

ELF에서는 유사한 기능으로 프로그램 헤더의 `INTERP`형 항목에 인터프리터를 기술할 수 있다. OS는 실행 가능한 바이너리와 함께 인터프리터로 지정된 동적 링크 라이브러리도 로드하여 동적 링크의 처리를 수행한다. FreeBSD의 커널 바이너리는 인터프리터가 커널에서는 사용되지 않는다는 점을 이용하여, 인터프리터로 `/red/herring`을 지정하고 있다.[35]

참조

[1] 웹사이트 Advanced Bash Scripting Guide: Chapter 2. Starting Off With a Sha-Bang http://tldp.org/LDP/[...] 2019-12-10
[2] 서적 Advanced Bash Scripting Guide 5.3 Volume 1 https://books.google[...] lulu.com 2010-11-05
[3] 서적 HTML5: The Missing Manual https://books.google[...] O'Reilly Media
[4] 서적 Learning Python https://books.google[...] O'Reilly Media 2009-09
[5] 서적 CGI Programming with PERL https://archive.org/[...] O'Reilly Media 2000-07-29
[6] 서적 Beginning Python: From Novice to Professional https://books.google[...] Apress 2005-10-04
[7] 서적 Linux+ Guide to Linux Certification https://books.google[...] Course Technology 2002-12-24
[8] 웹사이트 execve(2) - Linux man page http://linux.die.net[...] 2010-10-21
[9] 웹사이트 SRFI 22 http://srfi.schemers[...]
[10] 웹사이트 Python - Python3 shebang line not working as expected https://stackoverflo[...]
[11] 웹사이트 The #! magic, details about the shebang/hash-bang mechanism: Blank after #! required? https://www.in-ulm.d[...] 2024-01-18
[12] 문서 if permitted by the file's exec permission bits
[13] 웹사이트 The Open Group Base Specifications Issue 7 http://pubs.opengrou[...] 2010-04-05
[14] 웹사이트 pixelbeat.org: Common shell script mistakes http://www.pixelbeat[...]
[15] 간행물 The Open Group Base Specifications (IEEE Std 1003.1-2017) IEEE
[16] 간행물 Autoconf https://www.gnu.org/[...] Free Software Foundation
[17] 웹사이트 What's with #!/usr/bin/env bash? https://burnthewhich[...] 2024-03-06
[18] 웹사이트 /usr/bin/env behaviour http://mail-index.ne[...] Mail-index.netbsd.org 2010-11-18
[19] 문서 'env(1) - FreeBSD'
[20] 웹사이트 env invocation https://www.gnu.org/[...] 2020-02-11
[21] 웹사이트 Carriage Return causes bash to fail http://askubuntu.com[...] 2013-11-08
[22] 웹사이트 GNU Autoconf Manual v2.57, Chapter 10: Portable Shell Programming http://www.gnu.org/s[...] 2020-05-14
[23] 웹사이트 FAQ UTF-8, UTF-16, UTF-32 & BOM: Can a UTF-8 data stream contain the BOM character (in UTF-8 form)? If yes, then can I still assume the remaining UTF-8 bytes are in big-endian order? https://www.unicode.[...] 2023-11-10
[24] 웹사이트 Jargon File entry for shebang http://catb.org/jarg[...] 2010-06-16
[25] 웹사이트 Perl didn't grok setuid scripts that had a space on the first line between the shebang and the interpreter name https://groups.googl[...] USENET
[26] 웹사이트 CSRG Archive CD-ROMs http://www.mckusick.[...]
[27] 간행물 UNIX TIME-SHARING SYSTEM: UNIX PROGRAMMER'S MANUAL http://cm.bell-labs.[...] 1979-01
[28] 웹사이트 linux - Why is SUID disabled for shell scripts but not for binaries? https://security.sta[...]
[29] 웹사이트 Dennis Ritchie and Hash-Bang https://www.talisman[...] Talisman.org 2020-12-03
[30] 뉴스 Playing with Binary Formats http://www.linuxjour[...] 2015-01-01
[31] 문서 記事名の制約につき、記事名としての番号記号は全角井桁
[32] 웹사이트 The #! magic, details about the shebang/hash-bang mechanism https://www.in-ulm.d[...] 2022-11-23
[33] 문서 システムコールではなく、ライブラリでエミュレートする実装も在った(SVR2ベースのEWS-UXなど)。この場合、スクリプトのsetuidやsetgidは無視される。
[34] 문서 C Shellからスクリプトを実行された際に、Bourne Shellで実行させる為。
[35] 웹사이트 freebsd-src/sys/conf/kern.pre.mk at main · freebsd/freebsd-src https://github.com/f[...] 2024-06-27
[36] 웹인용 Advanced Bash Scripting Guide http://tldp.org/LDP/[...] 2012-01-19
[37] 웹인용 The #! magic, details about the shebang/hash-bang mechanism http://www.in-ulm.de[...] 2012-01-19
[38] 서적 Advanced Bash Scripting Guide 5.3 Volume 1 http://books.google.[...] lulu.com 2010-11-05
[39] 서적 HTML5: The Missing Manual http://books.google.[...] 오라일리 미디어
[40] 서적 Learning Python http://books.google.[...] 오라일리 미디어 2009-09
[41] 서적 Beginning Python: From Novice to Professional http://books.google.[...] Apress 2005-10-04
[42] 서적 Linux+ Guide to Linux Certification http://books.google.[...] Course Technology 2002-12-24
[43] 웹인용 execve(2) - Linux man page http://linux.die.net[...] 2010-10-21
[44] 문서 InstantFPC documentation http://wiki.freepasc[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com