유닉스 콘솔이나 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, 다른 또는 뭔가. (실제로 커널은 종종 사용자의 기본 쉘을 사용하여 파일을 해석합니다. 파일이 올바른 해석기가 아니거나 일부를 구문 분석 할 수는 있지만 다음과 같이 미묘한 동작 차이가 있기 때문에 매우 위험합니다 shbash) 사이의 경우

에 대한 메모 /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.shbin현재 디렉토리 아래의 디렉토리.


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.