Bash 파일 확장자 란 무엇입니까?


82

텍스트 편집기에서 bash 스크립트를 작성했습니다. bash 스크립트로 실행할 수 있도록 스크립트를 어떤 확장자로 저장해야합니까? 이론상 ssh 서버를 시작해야하는 스크립트를 만들었습니다. 클릭하면 스크립트를 실행하는 방법이 궁금합니다. OS X 10.9.5를 실행하고 있습니다.


4
셸 스크립트에는 특정 확장이 필요하지 않습니다. 그냥로 실행bash myscript
anubhava

7
일반적 .sh으로이지만 확장이 전혀 존재하지 않아도됩니다. Linux는 Windows가 아닙니다. 스크립트를 해석 할 프로그램은 첫 번째 줄에서 결정됩니다 #!/bin/bash. 매개 변수를 포함 할 수도 있습니다.
Havenard

1
@anubhava 어떻게 내가 그냥 더블 클릭을했고, 실제로 "배쉬로 myscripf"를 입력하면 내 스크립트가 실행 얻을 것
아메데오

2
@Amedeo는 #!/bin/bash.
Havenard

답변:


106

다른 답변에 동의하지 .sh않는 경우 쉘 스크립트에 대한 확장 을 사용하는 일반적인 규칙이 있지만 유용한 규칙은 아닙니다. 확장 프로그램을 전혀 사용하지 않는 것이 좋습니다. foo.sh이름 때문에 쉘 스크립트 라는 것을 알 수있는 장점 은 최소한이며 유연성을 잃고 비용을 지불합니다.

bash 스크립트를 실행 가능하게 만들려면 맨 위에 shebang 줄 이 있어야합니다 .

#!/bin/bash

chmod +x시스템이 실행 파일로 인식하도록 명령을 사용 하십시오. 그런 다음에 나열된 디렉토리 중 하나에 설치해야합니다 $PATH. 스크립트가 호출 foo되면 다음을 입력하여 쉘 프롬프트에서 실행할 수 있습니다 foo. 또는 현재 디렉터리에있는 경우 (임시 스크립트에 일반적으로 사용됨)을 입력 할 수 있습니다 ./foo.

쉘도 운영 체제도 파일 이름의 확장자 부분에주의를 기울이지 않습니다. 이름의 일부일뿐입니다. 그리고 특별한 확장을 제공 하지 않음 으로써이를 사용하는 모든 사람 (사용자 또는 다른 스크립트)이 쉘 스크립트 (sh, bash, csh 등)에 관계없이 어떻게 구현되었는지 신경 쓰지 않아도됩니다. , Perl, Python 또는 Awk 스크립트 또는 바이너리 실행 파일입니다. 이 시스템은 구현 방법을 모르거나 신경 쓰지 않고도 해석 된 스크립트 또는 바이너리 실행 파일을 호출 할 수 있도록 특별히 설계되었습니다.

UNIX와 유사한 시스템은 순전히 텍스트 명령 줄 인터페이스로 시작되었습니다. KDE 및 Gnome과 같은 GUI는 나중에 추가되었습니다. GUI 데스크탑 시스템에서는 일반적으로 프로그램을 참조하는 아이콘을 두 번 클릭하여 프로그램을 실행할 수 있습니다 (스크립트 또는 바이너리 실행 파일인지 여부). 일반적으로 이것은 프로그램이 인쇄 할 수있는 모든 출력을 버리고 명령 줄 인수를 전달할 수 없습니다. 쉘 프롬프트에서 실행하는 것보다 훨씬 덜 유연합니다. 그러나 일부 프로그램 (대부분 GUI 클라이언트)의 경우 더 편리 할 수 ​​있습니다.

쉘 스크립팅은 GUI가 아닌 명령 줄에서 가장 잘 학습합니다.

(일부 도구 파일 확장자에주의를 기울입니다. 예를 들어, 컴파일러는 일반적으로 코드가 작성되는 언어를 결정하기 위해 확장자를 사용합니다 : .cC 용, .cppC ++ 용 등.이 규칙은 실행 파일에는 적용되지 않습니다.)

UNIX (및 UNIX 계열 시스템)는 Windows가 아닙니다. MS Windows는 일반적으로 파일의 확장자를 사용하여 파일을 열거 나 실행하는 방법을 결정합니다. 바이너리 실행 파일에는 .exe확장자 가 있어야합니다 . Windows에 UNIX와 유사한 셸이 설치되어있는 경우 .sh확장을 셸 스크립트로 인식하도록 Windows를 구성 하고 셸을 사용하여 열 수 있습니다. Windows에는 #!규칙 이 없습니다 .


2
제가 목표로하는 것은 네 번째 단락에서 언급 한 것입니다. 그것을 참조하는 아이콘을 클릭하면 내 스크립트를 실행합니다.
Amedeo

2
@Amedeo : 그렇다면 데스크톱 환경에 따라 다릅니다. 내가 사용하는 (Ubuntu의 Cinnamon) 실행 가능한 스크립트 아이콘을 두 번 클릭하면 터미널에서 실행하거나 편집기에서 표시하거나 터미널없이 실행하라는 메시지가 표시됩니다. 파일 확장자에 관계없이이를 수행합니다.
Keith Thompson

3
(Necro) 확장자를 생략하면 같은 이름의 폴더를 가질 수 없습니다. 예를 들어 추가 배포 논리 가있는 deploy.sh(또는 deploy.bash) 및 폴더가 deploy있습니다. 스크립트의 이름을 간단히 변경하면 deploy이름 충돌이 발생합니다. 파일 또는 폴더의 이름을 다르게 지정하면 관리 용이성과 파일 정렬 ( ls, 편집기 등)이 손상 될 수 있습니다 . 물론 shebang은 결국 결정자입니다. 그러나 파일 확장자에는 적절한 위치가 있습니다.
Kafoso

2
@Kafoso : 같은 이름의 스크립트와 디렉터리가 필요하다고 생각한 적이 없습니다. 그렇게 Deploy하면 대소 문자를 구분하지 않는 파일 시스템에 복사 할 때 문제가 발생할 수 있지만 디렉토리를 호출 할 수 있습니다.
Keith Thompson

2
Mac에서 파일을 두 번 클릭하면 항상 기본 앱에서 열립니다. 따라서 .sh원하는 편집기에서 스크립트가 열리도록 확장 기능 을 사용하는 것이 좋습니다 . 두 번 클릭했을 때 스크립트를 실행하려면 .command확장자를 지정하면 두 번 클릭하면 터미널에서 실행됩니다.
BallpointBen

17

확장이 필요하지 않습니다 (또는 임의의 확장을 선택할 수 있지만 .sh유용한 규칙입니다).

#!/bin/bash(첫 번째 줄은 execve (2) syscall에 의해 이해 됨)로 스크립트를 시작 해야하며 chmod u+x. 따라서 스크립트가 일부 파일에 $HOME/somedir/somescriptname.sh있는 경우 한 번 입력해야합니다.

 chmod u+x  $HOME/somedir/somescriptname.sh

터미널에서. 명령에 대해서는 chmod (1 ) 을, syscall에 대해서는 chmod (2) 를 참조하십시오.

당신은 전체 파일 경로를 입력하지 않는 한, 당신이 언급 한 일부 디렉토리에이 파일을 넣어야 당신 PATH(참조 와 환경 (7)execvp는 (3) ) 당신이 영구적으로 설정할 수 있습니다, ~/.bashrc사용자의 로그인 쉘 인 경우 bash)

BTW, 다른 언어로 스크립트를 작성할 수 있습니다. 예를 들어 Python에서으로 시작 #!/usr/bin/python하거나 Ocaml로 시작하여 #!/usr/bin/ocaml...

두 번 클릭하여 스크립트를 실행하는 것은 데스크탑 환경 문제이며 데스크탑에 따라 다를 수 있습니다 (Kde, Mate, Gnome, .... 또는 IceWM 또는 RatPoison과 다를 수 있음). EWMH 사양을 읽는 것이 더 나은 그림을 얻는 데 도움이 될 수 있습니다.

스크립트를 실행 가능 chmod하게 만들면 데스크톱에서 클릭 할 수 있습니다 (분명히 MacOSX의 Quartz ). 하지만 시각적 인 피드백을 제공하도록해야 할 것입니다.

그리고 몇몇 컴퓨터에는 ssh 를 사용하여 원격으로 액세스 할 때 자신의 데스크톱을 포함하여 데스크톱이 없습니다 .

클릭하여 쉘 스크립트를 실행하는 것은 좋은 생각이 아니라고 생각합니다. 셸 스크립트에 인수를 제공 할 수 있기를 원할 것입니다 (그리고 클릭하면 어떻게 할 수 있습니까?). 출력에주의해야합니다. 쉘 스크립트를 작성할 수 있다면 터미널에서 대화 형 쉘을 사용할 수 있습니다. 스크립트를 사용하는 가장 좋고 가장 자연스러운 방법입니다. 좋은 대화 형 셸 (예 : zsh 또는 fish 또는 최근 bash)은 맛있고 구성 가능한 자동 완성 기능을 갖추고 있으며 많이 입력 할 필요가 없습니다 ( tab키보드 키 사용법 배우기 ). 또한 스크립트와 프로그램은 종종 복합 명령 (파이프 라인 등)의 일부입니다.

추신. 저는 1986 년부터 Unix를 사용하고 1993 년부터 Linux를 사용하고 있습니다. 클릭만으로 프로그램이나 스크립트를 시작한 적이 없습니다. 왜 그래야합니까?


3
좋습니다. 저는 텍스트 편집기에서 스크립트를 만들었습니다. 데스크탑에 파일을 저장합니다. 데스크탑에 저장된 스크립트를 클릭 할 때 클릭하면 실제로 실행되기를 원합니다.
Amedeo

6
귀하의 데스크탑 (KDE, Gnome, MATE 등)이 무엇인지 모르겠습니다. 특히 스크립트를 실행하기 위해 터미널에서 명령 줄을 사용할 것을 강력히 권합니다 (아마도 몇 가지 인수를주고 싶을 것입니다. 데스크탑에서 어떻게할까요?). 당신이 쉘 스크립트를 코딩 할 수있는 경우는 터미널에서 대화식 쉘을 사용할 수 있어야합니다
실레 Starynkevitch

2
내 요점은 쉘 스크립트를 코딩하는 경우 터미널에서 명령 줄을 사용하는 습관을 가져야한다는 것입니다.
Basile Starynkevitch

2
나는 그것이 내가 일하고있는 프로젝트라는 것을 이해한다. 클릭하면 스크립트가 실행되기를 원합니다. 터미널을 사용하여 스크립트를 실행하지 않으려 고합니다.
Amedeo

3
소유자에게 실행 가능성을 제한하는 특별한 이유가없는 한을 chmod +x대신 사용 chmod u+x합니다.
Keith Thompson

2

나는 이것이 지금 꽤 오래되었다는 것을 알고 있지만 이것이 질문이 요구하는 것에 추가되는 것 같습니다.

Mac에서 스크립트를 두 번 클릭하여 스크립트를 실행하려면 .command확장 프로그램 을 사용해야합니다 . 이전과 동일하게 chmod -x.

이전에 언급했듯이 이것은 실제로 그렇게 유용한 tbh가 아닙니다.


1

그냥 .sh.

다음과 같이 스크립트를 실행하십시오.

./script.sh

편집 : anubhava가 말했듯이 확장은 실제로 중요하지 않습니다. 그러나 조직적인 이유로 확장 프로그램을 사용하는 것이 좋습니다.


6
스크립트를 실행하는 경우 일반적으로 작성된 내용에 신경 쓸 이유가 없습니다. bash 스크립트와 바이너리 실행 파일은 동일한 방식으로 실행됩니다. .sh실행 가능한 스크립트에 접미사를 추가하는 것은 일반적으로 쓸모가 없습니다.
Keith Thompson

1
예,하지만 제가 편집에서 말했듯이 스크립트를 구성하는 것은 관습입니다.
Marc Anton Dahmen 2015 년

4
.sh확장 기능 이있는 스크립트를 많이 .bash보지만 (확장 기능 이있는 스크립트는 적습니다 ), 그것이 전혀 유용하지 않다고 확신합니다. 스크립트의 이름을 지정하고 foo.sh나중에 Perl에서 다시 구현하기로 결정하면 이름을 변경 (및 사용하는 모든 항목 편집)하거나 잘못된 확장명으로 남겨 둘 수 있습니다. 내가 이름을 지정하면 foo그 문제가 없습니다.
Keith Thompson

1

TL; DR-스크립트의 사용자 (반드시 개발자 일 필요는 없음)가 GUI 인터페이스를 사용하는 경우 사용중인 파일 브라우저에 따라 다릅니다. MacOS의 Finder는 .sh스크립트를 실행하기 위해 확장 이 필요합니다 . 그러나 Gnome Nautilus는 .sh확장자 가 있거나없는 스크립트를 제대로 인식 합니다.

bash 스크립트에서 확장을 사용하는 이유와 반대하는 이유가 이미 여러 번 언급되었지만 확장을 사용하지 않는 이유 또는 이유는 많지 않지만 경험상 좋은 규칙이라고 생각하는 것이 있습니다.

bash에 들어갔다 나오고 터미널을 일반적으로 사용하는 유형이거나 터미널을 사용하지 않는 다른 사람을위한 도구를 개발하는 경우 .shbash 스크립트에 확장을 추가하십시오. 이렇게하면 해당 스크립트의 사용자는 GUI 파일 브라우저에서 해당 파일을 두 번 클릭하여 스크립트를 실행할 수 있습니다.

주로 터미널에서 작업의 전부 또는 대부분을 수행하는 유형이라면 bash 스크립트에 확장 기능을 추가하지 마십시오. ~/.bashrc스크립트와 디렉토리를 시각적으로 구분 하기 위해 파일을 이미 설정했다고 가정하면 터미널에서 아무런 용도가 없습니다 .

편집하다:

Gnome Nautilus 파일 브라우저에서 4 개의 테스트 파일 (각각 파일을 실행할 권한이 부여됨)에서 터미널 창을 여는 어리석은 간단한 bash 명령을 사용합니다 ( gnome-terminal).

  1. #!/bin/bash첫 번째 줄에 확장자가없는 파일 .

    파일을 두 번 클릭하면 작동합니다.

  2. 첫 번째 줄에 .sh확장자가 있는 파일 #!/bin/bash.

    파일을 두 번 클릭하면 작동합니다.

  3. #!/bin/bash첫 번째 줄에 NO 확장자가있는 파일 .

    기술적으로 파일을 두 번 클릭하여 작동했지만 GUI는 그것이 쉘 스크립트라는 표시를주지 않았습니다. 그것은 단지 평문 파일이라고 말했다.

  4. 첫 번째 줄에 .sh확장명이 NO 인 파일 #!/bin/bash.

    파일을 두 번 클릭하면 작동합니다.

그러나 Keith Thompson 이이 답변의 의견에서 현명하게 지적했듯이 .sh파일의 첫 번째 줄 ( #!/bin/bash) 에서 bash shebang 대신 확장을 사용 하면 문제가 발생할 수 있습니다.

그러나 이전에 MacOS를 사용하고 있었을 때 .sh확장명이없는 bash 스크립트도 MacOS의 GUI에서 실행할 수 없다는 것을 기억합니다. 나는 누군가가 코멘트에서 나를 수정하기를 원합니다. 이것이 사실이라면 .sh확장이 중요한 곳에 적어도 하나의 파일 브라우저가 있다는 것을 증명할 것입니다 .


어떤 GUI 파일 브라우저를 사용하십니까 (또는 사용자가 무엇을 사용합니까?) 확장을 사용하여 스크립트 실행 방법을 결정합니까?
Keith Thompson

제가 가장 많이 경험 한 플랫폼은 MacOS입니다. Finder에서 사용자는 어떤 확장 프로그램과 연결할 앱을 결정합니다. 지금은 Gnome을 사용하는 Linux를 사용하고 있지만 Gnome의 Nautilus 파일 브라우저가 확장명이없는 파일과 상호 작용하는 방법을 아직 실험 해 보지 않았습니다.
Ryan Hart

첫 번째 줄에 .sh접미사 가있는 실행 가능한 스크립트 #!/bin/bash가있는 경우 GUI 파일 브라우저가 sh이를 호출하는 데 사용할 것 입니까 (shebang 무시)? 그렇다면 문제가 발생할 수 있습니다. (답은 다른 브라우저에 대한 다를 수 있습니다.)
키이스 톰슨

거기에 좋은 점. 위의 답변을 방금 수행 한 실제 테스트로 업데이트했습니다.
Ryan Hart

흥미롭지 만 .. 당신은 그것이 "작동했다"고 말했다. 4 개의 테스트 케이스 각각에 대해 /bin/bash또는로 호출했는지 여부를 아는 것이 좋습니다 /bin/sh(후자는 shebang이없는 스크립트의 기본값입니다). 경우 /bin/sh에 심볼릭 링크 /bin/bash(매우 일반적이다) 당신은의 값을 보면 알 수 있습니다 $0. (배쉬가 불려 갔을 경우 또한,로 sh가 설정합니다 POSIXLY_CORRECT=y.)
키이스 톰슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.