유닉스 콘솔이나 Mac 터미널에서 쉘 스크립트를 실행하는 방법은 무엇입니까?


507

나는 그것을 알고 잊고 다시 다시 배우십시오. 적을 시간입니다.


15
평판 스테이션까지 upvote 기차를 작성
— DivideByZer0

당신이 거기에서 얻은 그 멋진 오류에 감탄하기 위해 공감하지 않을 것입니다!
— BRHSM

답변:


942

실행 불가능한 sh스크립트 를 실행하려면 다음을 사용하십시오.

sh myscript

실행 불가능한 bash스크립트 를 실행하려면 다음을 사용하십시오.

bash myscript

실행 파일 (실행 권한이있는 파일)을 시작합니다. 경로로 지정하면됩니다.

/foo/bar
/bin/bar
./bar

스크립트를 실행 가능하게하려면 필요한 권한을 부여하십시오.

chmod +x bar
./bar

파일이 실행 가능한 경우, 커널 은 파일을 실행 하는 방법을 알아낼 책임이 있습니다. 이진이 아닌 경우 파일의 첫 번째 줄을 보면됩니다. 포함해야합니다 hashbang:

#! /usr/bin/env bash

hashbang은 커널에게 실행할 프로그램을 알려줍니다 (이 경우 명령 /usr/bin/env은 인수와 함께 실행됩니다 bash). 그런 다음 스크립트는 스크립트에 제공 한 모든 인수와 함께 후속 인수로 프로그램에 두 번째 인수로 전달됩니다.

즉, 실행 가능한 모든 스크립트에는 hashbang이 있어야합니다 . 그렇지 않은 경우, 당신은 어떤 커널 이야기하지 않을 입니다 , 따라서 커널은 그것을 interprete하는 데 사용하는 어떤 프로그램이 알 수 없습니다. 그것은 수 bash, perl, python, sh, 다른 또는 뭔가. (실제로 커널은 종종 사용자의 기본 쉘을 사용하여 파일을 해석합니다. 파일이 올바른 해석기가 아니거나 일부를 구문 분석 할 수는 있지만 다음과 같이 미묘한 동작 차이가 있기 때문에 매우 위험합니다 sh와 bash) 사이의 경우

에 대한 메모 /usr/bin/env

가장 일반적으로 다음과 같이 해시 뱅이 나타납니다.

#!/bin/bash

결과는 커널 프로그램을 실행하는 것입니다 /bin/bash스크립트를 해석 할 수 있습니다. 불행히도 bash항상 기본적으로 제공되는 것은 아니며 항상에서 사용할 수있는 것은 아닙니다 /bin. Linux 시스템에는 일반적 bash으로 /usr/xpg/bin/bash또는 다른 여러 위치에 배송되는 다른 POSIX 시스템이 /usr/local/bin/bash있습니다.

이식 가능한 bash 스크립트를 작성하기 위해 bash프로그램 의 위치를 ​​하드 코딩하지 않아도 됩니다. POSIX에는 이미 다음과 같은 처리 메커니즘이 PATH있습니다. 아이디어는 디렉토리에있는 디렉토리 중 하나에 프로그램을 설치 PATH하고 시스템은 프로그램을 이름으로 실행하려고 할 때 프로그램을 찾을 수 있어야한다는 것입니다.

슬프게도, 당신 은 이것을 할 수 없습니다 :

#!bash

커널은 PATH당신을 검색 하지 않을 것입니다. PATH하지만 당신을 검색 할 수있는 프로그램이 있습니다 env. 다행히, 거의 모든 시스템은이 env설치 프로그램을 /usr/bin. 우리는 시작 그래서 env다음 않는 하드 코딩 된 경로를 사용하여 PATH검색을 bash하고 스크립트를 해석 할 수 있도록 실행을 :

#!/usr/bin/env bash

POSIX에 따르면 hashbang은 하나의 인수를 가질 수 있습니다 . 이 경우 프로그램 bash의 인수로 사용합니다 env. 즉,에 인수를 전달할 공간이 없습니다 bash. 따라서이 #!/bin/bash -exu체계 와 같은 것을 변환 할 수있는 방법이 없습니다 . set -exu대신 해시 뱅 을 배치 해야합니다.

이 방법에는 또 다른 장점이 있습니다. 일부 시스템에는이 포함 /bin/bash되어 있지만 사용자가 좋아하지 않거나 버그가 있거나 구식이거나 bash다른 곳에 설치했을 수 있습니다 . Apple이 오래된 제품을 출하 /bin/bash하고 사용자가 /usr/local/bin/bashHomebrew와 같은 것을 사용하여 최신 버전을 설치하는 OS X (Mac)의 경우가 종종 있습니다. 검색 env을 수행하는 접근 방식을 사용하는 PATH경우 사용자의 환경 설정을 고려하고 시스템과 함께 제공된 것보다 선호하는 bash를 사용합니다.


66
간단한 질문에 대한 좋은 답변을 작성해 주셔서 감사합니다.
— PA

5
내가 사용하는 경우 zsh내 껍질로, 나는을 사용 hashbang #! /usr/bin/env zsh?
— stefmikhail

6
@stefmikhail : 스크립트 를 호출 하는 데 사용하는 쉘 인터프리터는 중요하지 않습니다 . 스크립트 내의#! /usr/bin/env zsh 코드 가 Z 쉘에 의해 실행 되어야하는 경우 if 를 사용해야합니다 .
— Johnsyweb

1
설명을 위해 +1 나는 잊는 경향이 있지만 명령의 의미를 아는 것은 내가 기억하는 데 도움이 될 것이다.
— Angelin Nadar 2014

2
@Carpetsmoker 이것은 정확하며 hashbang에 국한되지 않습니다. bash 스크립트는 항상 UNIX 줄 끝을 사용해야합니다. 그렇지 않으면 hashbang 명령 이름과 같이 모든 명령의 마지막 인수에 \ r이 추가됩니다.
— lhunath

80

쉘 스크립트 'file.sh'를 시작하려면 다음을 수행하십시오.

sh file.sh

bash file.sh

다른 옵션은 chmod 명령을 사용하여 실행 권한을 설정합니다.

chmod +x file.sh

이제 다음과 같이 .sh 파일을 실행하십시오.

./file.sh

16

본 쉘의 경우 :

sh myscript.sh

bash의 경우 :

bash myscript.sh

이 분명한 질문에 답변 해 주셔서 감사합니다. 나와 같은 Mac 사용자의 경우 랩 사이의 오래된 Unix 명령을 잊어 버리기 쉽습니다.
— PA

10

스크립트를 현재 쉘에서 실행하려면 (예 : 디렉토리 또는 환경에 영향을 줄 수 있도록) 다음과 같이 말해야합니다.

. /path/to/script.sh

또는

source /path/to/script.sh

참고 /path/to/script.sh예를 들어, 상대가 될 수는 . bin/script.sh를 실행 script.sh에 bin현재 디렉토리 아래의 디렉토리.


7
관련 경로 이름으로 소싱하거나 점을 찍을 때 매우 주의 하십시오 . 항상 ./로 시작 해야합니다. 이 작업을 수행하지 않고 상대 경로 이름에 슬래시가 포함되어 있지 않으면 현재 디렉토리의 항목보다 먼저 PATH의 항목을 소싱해야합니다! 학대에 매우 위험합니다.
— lhunath 2009

0

먼저 실행 권한을 부여하십시오.
chmod +x script_name

  1. 스크립트가 실행 가능하지 않은 경우 :
    -sh 스크립트 파일을
    sh script_name
    실행하는 경우 :-bash 스크립트 파일을 실행하는 경우 :-
    bash script_name
  2. 스크립트가 실행 가능한 경우 :-
    ./script_name

참고 :- 'ls -a'를 사용하여 파일이 실행 가능한지 여부를 확인할 수 있습니다


0

파일 확장자 .command는 Terminal.app에 할당됩니다. .command 파일을 두 번 클릭하면 실행됩니다.


0

또한 스크립트에서 #! hashbang 을 사용하여 동일한 폴더에서 인터프리터를 실행합니다 .

예를 들어 / usr / bin 에서 복사 한 php7.2 실행 파일 은 hello 스크립트 와 함께 폴더에 있습니다.

#!./php7.2
<?php

echo "Hello!"; 

그것을 실행하려면 :

./hello

다음과 같은 동작을합니다.

./php7.2 hello
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.