본문 바로가기
리눅스

(번역) Shell script

by 다움위키 2025. 2. 11.

원문 보기: https://dawoum.duckdns.org/wiki/Shell_script

 

Original article: w:Shell script

쉘 스크립트명령-줄 인터프리터, 유닉스 쉘에 의해 실행되도록 설계된 컴퓨터 프로그램입니다. 쉘 스크립트의 다양한 방언은 명령 언어로 고려됩니다. 쉘 스크립트에 의해 수행되는 전형적인 작업에는 파일 조작, 프로그램 실행, 및 텍스트 인쇄가 포함됩니다. 환경을 설정하고, 프로그램을 실행하고, 필요한 정리 또는 로깅을 수행하는 스크립트는 래퍼(wrapper)라고 불립니다.

그 용어는 일반적으로 운영 시스템 셸을 실행하는 자동화 모드를 의미하기 위해 사용됩니다; 각 운영 시스템은 배치 파일 (MSDos-Win95 스트림, OS/2), 명령 프로시저 (VMS), 및 쉘 스크립트 (Windows NT 스트림 및 4NT와 같은 타사 파생 제품—기사는 cmd.exe에 있음)를 포함하여 이들 기능에 대해 특정 이름을 사용하고 메인프레임 운영 시스템은 여러 용어와 관련이 있습니다.

유닉스 및 유닉스-계열 시스템에 공통적으로 존재하는 쉘에는 Korn , Bourne , 및 GNU Bash가 있습니다. 유닉스 운영 시스템에는 macOSZsh와 같이 다른 기본 쉘이 있을 수 있지만, 이들 쉘은 전형적으로 이전 버전과의 호환성을 위해 존재합니다.

Capabilities

Comments

주석은 쉘에 의해 무시됩니다. 주석은 전형적으로 해시 기호 (#)로 시작하고, 줄의 끝까지 계속됩니다.

Configurable choice of scripting language

shebang, 또는 hash-bang은 시스템이 파일을 실행하기 위해 어떤 인터프리터를 사용할지 결정하기 위해 사용하는 특별한 종류의 주석입니다. shebang은 파일의 첫 번째 줄이어야 하고, "#!"으로 시작해야 합니다. 유닉스-계열 운영 시스템에서, "#!" 접두사 뒤에 오는 문자는 스크립트를 해석할 실행-가능 프로그램의 경로로 해석됩니다.

Shortcuts

쉘 스크립트는 특수 환경 설정, 명령 옵션, 또는 이후-처리가 자동으로 적용되는 시스템 명령의 편리한 변형을 제공할 수 있지만, 새로운 스크립트가 여전히 완전한 일반 유닉스 명령처럼 작동할 수 있도록 합니다.

한 가지 예로, 파일을 나열하는 명령, ls의 버전을 만들고, 명령 이름을 l로 줄여서 지정하는 것이며, 이 이름은 통상적으로 사용자의 bin 디렉토리에 /home/username/bin/l로 저장되고, 기본 명령 옵션 모음이 미리-제공됩니다.

#!/bin/sh
LC_COLLATE=C ls -FCas "$@"

여기서, 첫 번째 줄은 shebang을 나머지 스크립트를 실행할 인터프리터를 지정하기 위해 사용하고, 두 번째 줄은 파일 형식 표시기, 열, 모든 파일 (생략된 파일 없음), 및 블록 단위 크기에 대한 옵션을 나열합니다. LC_COLLATE=C는 기본 정렬 순서를 대문자와 소문자를 함께 접지 않고, 이름에 구두점을 무시하는 부작용으로 도트-파일(dotfiles)을 정규 파일 이름과 섞지 않도록 설정하고 (도트-파일은 보통 -a와 같은 옵션이 사용된 경우에만 표시됨), "$@"는 l에 주어진 모든 매개변수가 ls에 매개변수로 전달되도록 하므로, ls에 알려진 모든 일반 옵션과 기타 구문을 계속 사용할 수 있습니다.

사용자는 그런-다음 가장 공통적으로 사용되는 단축 목록에 대해 l을 사용하면 됩니다.

바로-가기로 사용할 수 있는 쉘 스크립트의 또 다른 예로는 주어진 디렉토리 내에 있는 모든 파일과 디렉토리의 목록을 출력하는 것입니다:

#!/bin/sh

clear
ls -al

이 경우에서, 쉘 스크립트는 #!/bin/sh의 정규적인 시작 줄로 시작합니다. 이어서, 스크립트는 다음 줄로 이동하기 전에 터미널의 모든 텍스트를 지우는 clear 명령을 실행합니다. 다음 줄은 스크립트의 주요 기능을 제공합니다. ls -al 명령은 스크립트가 실행되는 디렉토리에 있는 파일과 디렉토리를 나열합니다. ls 명령 속성은 사용자의 요구를 반영하도록 변경될 수 있습니다.

Batch jobs

쉘 스크립트는 명령줄 인터페이스에서 수동으로 입력되어야 하는 여러 명령을 자동으로 실행되도록 허용하고, 사용자에 대해 시퀀스의 각 단계를 트리거할 때까지 기다릴 필요가 없습니다. 예를 들어, 세 개의 C 소스 코드 파일을 갖는 디렉토리에서, 그것들로부터 최종 프로그램을 빌드하기 위해 필요한 네 가지 명령을 수동으로 실행하는 대신, POSIX-호환 쉘에 대한 스크립트를 만들 수 있으며, 여기서는 build라는 이름을 지정하고 해당 디렉토리에 보관하여, 그것들을 자동으로 컴파일합니다:

#!/bin/sh
printf 'compiling...\n'
cc -c foo.c
cc -c bar.c
cc -c qux.c
cc -o myprog foo.o bar.o qux.o
printf 'done.\n'

이 스크립트는 사용자에게 편집 중인 파일을 저장하고, 편집기를 일시 중지하고, 그런-다음 업데이트된 프로그램을 만들고, 그것을 테스트하고, 그런-다음 편집기로 돌아갈 수 있도록 ./build를 실행하는 것을 허용합니다. 어쨌든, 1980년대 이후로, 이러한 유형의 스크립트는 make와 같은 프로그램 빌드에 특화된 유틸리티로 대체되었습니다.

Generalization

간단한 일괄 작업은 분리된 임무에는 드물지 않지만, 쉘 루프, 테스트, 및 변수를 사용하는 것은 사용자에게 훨씬 더 많은 유연성을 제공합니다. JPEG 이미지를 PNG 이미지로 변환하는 POSIX sh 스크립트는, 여기서 이미지 이름이 스크립트 내에 나열되는 대신 명령줄에 제공되며 (아마도 와일드카드를 통해), 이 파일로 생성될 수 있으며, 전형적으로 /home/username/bin/jpg2png와 같은 파일에 저장됩니다:

#!/bin/sh
for jpg; do                                  # use $jpg in place of each filename given, in turn
    png=${jpg%.jpg}.png                      # construct the PNG version of the filename by replacing .jpg with .png
    printf 'converting "%s" ...\n' "$jpg"    # output status info to the user running the script
    if convert "$jpg" jpg.to.png; then       # use convert (provided by ImageMagick) to create the PNG in a temp file
        mv jpg.to.png "$png"                 # if it worked, rename the temporary PNG image to the correct name
    else                                     # ...otherwise complain and exit from the script
        printf >&2 'jpg2png: error: failed output saved in "jpg.to.png".\n'
        exit 1
    fi                                       # the end of the "if" test construct
done                                         # the end of the "for" loop
printf 'all conversions successful\n'        # tell the user the good news

그런-다음 jpg2png 명령은 /home/username/bin/jpg2png *.jpg만 사용하여 JPEG 이미지로 가득 찬 전체 디렉토리에서 실행될 수 있습니다.

Programming

많은 현대 쉘은 제어-흐름 구조, 변수, 주석, 배열, 서브루틴 등과 같이 보통 보다 정교한 일반적인-목적 프로그래밍 언어에서만 발견되는 다양한 기능을 제공합니다. 이들 종류의 기능을 사용과 함께, 상당히 정교한 응용 프로그램을 쉘 스크립트로 작성할 수 있습니다. 어쨌든, 그것들은 대부분의 쉘 언어가 데이터 입력 시스템, 클래스, 쓰레딩, 복잡한 수학, 및 기타 일반적인 전체 언어 기능을 거의 또는 전혀 지원하지 않고, 일반적으로 속도를 성능 목표로 작성된 컴파일된 코드나 해석된 언어보다 훨씬 느리다는 사실에 의해 여전히 제한됩니다.

표준 유닉스 도구 sedawk는 쉘 프로그래밍을 위한 추가 기능을 제공합니다; PerlTcl과 같은 다른 스크립팅 언어와 마찬가지로 쉘 스크립트에 포함될 수 있습니다. Perl과 Tcl에는 그래픽 툴킷도 함께 제공됩니다.

Typical POSIX scripting languages

Main article: Unix shell

유닉스, 리눅스, 및 POSIX-호환 운영 시스템 설치에서 공통적으로 발견되는 스크립팅 언어는 다음과 같습니다:

  • KornShell (ksh)에는 ksh88, Korn Shell '93 등 여러 가지 버전이 있습니다.
  • Bourne shell (sh), 아직도 널리 사용되는 가장 오래된 쉘 중 하나
  • C shell (csh)
  • GNU Bash (bash)
  • tclsh, Tcl/Tk 프로그래밍 언어의 주요 구성 요소인 쉘.
  • wish는 GUI-기반 Tcl/Tk 쉘입니다.

C 및 Tcl 쉘은 해당 프로그래밍 언어의 구문과 매우 유사한 구문을 가지고 있고, Korn 쉘과 Bash는 ALGOL 언어를 기반으로 하고 여러 다른 언어의 요소를 추가한 Bourne 쉘의 개발입니다. 다른 한편, awk, sed, grep, and BASIC, Lisp, C, 등과 같은 다양한 쉘과 도구는 Perl 프로그래밍 언어에 기여했습니다.

기계에서 사용 가능하거나 다운로드 및/또는 구매할 수 있는 다른 쉘은 다음과 같습니다:

Python, Ruby, C, Java, Perl, Pascal, Rexx 등을 기반으로 하는 쉘과 같은 관련 프로그램도 다양한 형태로 널리 이용 가능합니다. 다소 공통적인 또 다른 쉘은 Old shell (osh)로, 매뉴얼 페이지에는 "Sixth Edition UNIX로부터 표준 명령 인터프리터의 향상된 하위-호환 포트입니다"라고 명시되어 있습니다.

다음과 같은 원격 쉘이라고 불리는 것은,

실제로는 원격 시스템에서 복잡한 쉘을 실행하기 위한 도구일 뿐이고 그 자체로 '쉘'과 같은 특성은 없습니다.

Other scripting languages

Main article: Scripting language

많은 강력한 스크립팅 언어가 일반적인 쉘 스크립트로 편안하게 처리될 수 없을 만큼 크거나 복잡한 작업을 위해 도입되어 왔지만, 스크립트의 이점이 바람직하고 완전한 컴파일 프로그래밍 언어의 개발 오버헤드가 불리할 수 있습니다. 스크립팅 언어와 고급 프로그래밍 언어를 구분하는 구체적인 사항은 자주 논쟁의 대상이 되지만, 일반적으로 말하면, 스크립팅 언어는 인터프리터가 필요한 언어입니다.

Life cycle

쉘 스크립트는 종종 소프트웨어 개발에서 초기 단계로 사용되고, 나중에 다른 기본 구현으로 변환되는 경우가 많으며, 가장 공통적으로 Perl, Python, 또는 C로 변환됩니다. 인터프리터 지시는 구현 세부 정보를 파일 이름 확장자로 노출되는 대신 스크립트 내부에 완전히 숨길 수 있도록 허용하고, 최종 사용자에게 영향을 미치지 않고 다른 언어로 원활하게 재구현에 대해 제공합니다.

".sh" 파일 확장자를 갖는 파일은 보통 어떤 종류의 쉘 스크립트이지만, 대부분의 쉘 스크립트에는 파일 이름 확장자가 없습니다.

Advantages and disadvantages

아마도 쉘 스크립트를 작성하는 가장 큰 장점은 명령과 구문이 명령-줄에 직접 입력한 것과 정확하게 같다는 것입니다. 프로그래머는 스크립트가 다른 언어로 작성되었거나 컴파일된 언어가 사용된 경우와 같이 완전히 다른 구문으로 전환할 필요가 없습니다.

종종, 쉘 스크립트를 작성하는 것은 다른 프로그래밍 언어로 동등한 코드를 작성하는 것보다 훨씬 빠릅니다. 많은 장점으로는 쉬운 프로그램 또는 파일 선택, 빠른 시작, 및 대화형 디버깅이 있습니다. 쉘 스크립트는 기존 프로그램 주변의 시퀀싱 및 의사-결정 연결을 제공하기 위해 사용될 수 있고, 중간 크기의 스크립트에 대해 컴파일 단계가 없다는 것이 장점입니다. 해석적 실행을 통해 디버깅 코드를 스크립트에 쉽게 작성하고 다시 실행하여 버그를 감지하고 수정할 수 있습니다. 전문가가 아닌 사용자는 스크립팅을 프로그램의 동작을 조정하기 위해 사용할 수 있고, 쉘 스크립팅은 다중 처리에 대한 제한된 범위를 제공합니다.

다른 한편, 쉘 스크립팅은 비용이 많이 드는 오류가 발생하기 쉽습니다. rm -rf * / (의도한 rm -rf */ 대신)와 같은 실수로 인한 타이핑 오류는 유닉스 공동체에서 흔한 일입니다; 단일 여분의 공백은 명령을 현재 디렉토리에 포함된 모든 하위-디렉토리를 삭제하는 명령에서 파일 시스템의 루트 디렉토리로부터 모든 것을 삭제하는 명령으로 변환됩니다. 비슷한 문제는 cpmv를 위험한 무기로 바뀔 수 있고, > 리다이렉션의 잘못된 사용은 파일의 컨텐츠를 삭제할 수 있습니다. 이것은 이름에서 많은 유닉스 명령이 cp, cd, dd, df 등 한 글자만 다르다는 사실로 인해 더 큰 문제를 만듭니다.

또 다른 중요한 단점은 느린 실행 속력과 거의 모든 쉘 명령이 실행될 때마다 새 프로세스를 시작해야 한다는 것입니다. 스크립트의 작업이 효율적인 필터 명령이 대부분의 작업을 수행하는 파이프라인을 설정함으로써 달성될 수 있을 때, 속도 저하가 완화되지만, 복잡한 스크립트는 전형적으로 동등한 작업을 수행하는 기존 컴파일된 프로그램보다 몇 배 더 느립니다.

다른 플랫폼 사이에도 호환성 문제가 있습니다. Perl의 창시자, Larry Wall은 "쉘 스크립트를 이식하는 것보다 쉘을 이식하는 것이 더 쉽다"고 유명하게 썼습니다.

유사하게, 보다 복잡한 스크립트는 쉘 스크립팅 언어 자체의 한계에 부딪힐 수 있습니다; 이러한 한계로 인해 양질의 코드를 작성하기 어렵고, 원래 쉘 언어의 문제를 개선하기 위해 다양한 쉘을 확장하면 문제가 더 악화될 수 있습니다.

일부 스크립트 언어를 사용의 많은 단점은 언어 구문이나 구현의 설계 결함으로 인해 발생하고, 반드시 텍스트-기반 명령줄의 사용에 의해 나타나는 것은 아닙니다; 다른 쉘 프로그래밍 언어를 사용하거나 Scsh (Scheme 사용)와 같이 본격적인 언어를 사용하는 쉘도 많이 있습니다.

Interoperability among scripting languages

서로 다른 스크립팅 언어는 주로 POSIX 기반으로 인해 많은 공통 요소를 공유할 수 있고, 일부 쉘은 다른 쉘을 에뮬레이트하기 위한 모드를 제공합니다. 이것은 한 스크립팅 언어로 작성된 쉘 스크립트를 또 다른 스크립팅 언어로 조정될 수 있도록 허용합니다.

이에 대한 한 가지 예는 Bourne 쉘과 동일한 문법과 구문을 제공하고 POSIX-호환 모드도 제공하는 Bash입니다.  이를 테면, Bourne 쉘용에 대해 작성된 대부분의 쉘 스크립트는 BASH에서 실행될 수 있지만, 그 반대는 BASH에는 Bourne 쉘에 존재하지 않는 확장을 가지기 때문에 참이 아닐 수 있습니다. 이를 테면, 이들 기능은 bashisms으로 알려져 있습니다.

Shell scripting on other operating systems

Cygwin, MKS Toolkit, Interix (UNIX에 대해 Microsoft Windows 서비스에서 사용 가능), Hamilton C shell, UWIN (Windows에 대해 AT&T Unix), 등과 같은 상호 운용성 소프트웨어는 Windows NT 및 후속 버전을 실행되는 컴퓨터에서 유닉스 쉘 프로그램을 실행되도록 허용하고, MS-DOS-Windows 95 분기와 OS/2에 대해 이전 MKS Toolkit 버전에서는 일부 기능이 손실됩니다. 명령 쉘, Windows Script HostCGI 프로그래밍과 함께 사용되는 다중-사용 스크립팅 언어 패키지인 XLNT 외에도 Windows 유형 운영 시스템에 대해 최소 3개의 DCL 구현은 이들 시스템에서도 사용할 수 있습니다. Mac OS X 및 후속 버전도 유닉스-계열과 마찬가지입니다.

앞서 언급한 도구 외에도, 일부 POSIX 및 OS/2 기능은 Windows NT 운영 시스템 시리즈의 해당 환경 하위-시스템에서 Windows 2000까지 사용될 수 있습니다. 종종 MS-DOS 하위-시스템이라고 하는 세 번째 16-비트 하위-시스템은 이들 운영 시스템과 함께 제공되는 Command.com을 사용하여 앞서 언급한 MS-DOS 배치 파일을 실행합니다.

콘솔 대안 4DOS, 4OS2, FreeDOS, Peter NortonNDOS4NT / Take Command는 각각 Windows NT-스타일 cmd.exe, MS-DOS/Windows 95 배치 파일 (Command.com에 의해 실행), OS/2의 cmd.exe, 및 4NT에 기능을 추가하며, 강화하는 쉘과 유사하고 VBScript, JScript, 및 VBA의 세 가지 사전 설치 엔진이 제공되는 Windows Script Host와 더 통합되어 있으며, Rexx, Perl, Python, Ruby, 및 Tcl은 4NT 및 관련 프로그램에서 사전 정의된 기능을 가지고 있습니다. PC DOS는 MS-DOS와 매우 유사하지만, DR DOS는 더 다릅니다. 이전 버전의 Windows NT는 OS/2 하위-시스템에서 4OS2의 최신 버전을 실행할 수 있습니다.

스크립팅 언어는, 정의에 의해, 확장이 가능합니다; 예를 들어, MS-DOS/Windows 95/98, 및 Windows NT 유형 시스템은 쉘/배치 프로그램에 대해 KiXtart, QBasic, various BASIC, Rexx, Perl, 및 Python 구현, Windows Script Host 및 설치된 엔진과 같은 도구를 호출하도록 허용합니다. 유닉스 및 기타 POSIX 호환-시스템에서, awksed는 쉘 스크립트의 문자열 및 숫자 처리 기능을 확장합니다. Tcl, Perl, Rexx, 및 Python에는 그래픽 툴킷이 있고, 속도 병목 현상을 일으키는 쉘 스크립트의 함수와 프로시저를 코딩하기 위해 사용될 수 있고 (C, Fortran, 어셈블리 언어, 등은 훨씬 빠름) 소켓 및 기타 연결 기능, 중부하 텍스트 처리, 호출 스크립트에 해당 기능이 없으면 숫자로 작동, 자체-쓰기 및 자체-수정 코드, 재귀, 직접 메모리 접근, 다양한 유형의 정렬 등과 ​​같이 주 스크립트에서 어렵거나 불가능한 기술을 추가하기 위해 사용될 수 있습니다. Visual Basic for ApplicationsVBScript는 스프레드시트, 데이터베이스, 모든 유형의 스크립트-가능 프로그램, 통신 소프트웨어, 개발 도구, 그래픽 도구 및 Component Object Model을 통해 접근될 수 있는 기타 소프트웨어와 같은 항목을 제어하고 통신할 수 있습니다.

See also