GNU / Linux에서 셸 스크립트를 만드는 모범 사례

일반적으로 작업을 시작할 때 GNU / Linux 및 / 또는 Unix 운영 체제가있는 서버 관리 영역, 사람은 일반적으로 환경이있는 환경에서 일하는 자신 (얼굴)을 찾습니다. 다른 관리자가 작성한 예약 된 작업 무리 그리고 어느 시점에서 우리는 관리 (관리) 파라 기관의 새로운 요구 사항을 준수하기 위해 문제를 해결하고 개선 및 / 또는 제거합니다. 그가 일하는 곳. 그래서 당연합니다. 시스템 관리자 어떤 직장에서든 여러분은 몇 가지를 이해해야하는 번거로운 작업에 직면 해 있습니다. 쉘 스크립트 다른 사람이 만든 이전 SysAdmin, 잘 작성되지 않았거나 논리적 또는 쓰기 구조로되어 있거나 이해하기 쉽지 않거나 최악의 경우 명령 명령이 비정형 적이거나 오래되었거나 비효율적이거나 어색하고 혼란스러운 방식으로 작성되었습니다.

쉘 스크립팅

시 거냐 잘못 작성된 스크립트 해결 항상 순간적인 성가심입니다. 좋은 SysAdmin 중요한 것. 하나를 만들 것이라면 쉘 스크립트 오늘 이후로 사용하는 것이 항상 좋습니다. 매우 전문적이고 표준화 된 방식으로 작성, 시간이 지남에 따라 다른 사람 또는 자신이 최소한의 노력과 지식은 최소한의 시간에 이해와 관리를 달성합니다.

따라서 실제적인 일련의 간행물 이후 "셸 스크립팅 배우기" 간단하고 기본적인 명령으로 매우 실용적인 스크립트를 살펴볼 때 "GNU / Linux에서 쉘 스크립트를 만드는 모범 사례", 여기서 우리는 그것의 작은 측면과 많은 이유에 대해 철저히 집중할 것입니다. 즉, 우리가 더 나은 스크립트를 만들 수있는 몇 가지 팁을 다룰 것입니다. 그러나 우리 자신을 위해서가 아니라 다음 사람 (SysAdmin)을 위해 관리하십시오. 따라서 내가 무엇을 코딩하는지, 어떻게, 왜, 왜 더 이상 작동하지 않는지 파악하는 지루하고 어려운 작업을 수행 할 필요가 없습니다.

이 일에 첫 번째 (첫 번째) 게시물 이 새로운 시리즈의 "GNU / Linux를위한 좋은 쉘 스크립트를위한 모범 사례" 우리는 무엇이 들어가야하는지에 대해 이야기 할 것입니다. 쉘 스크립트 헤더.

=========================
헤더-쉘의 호출
=========================

#! / 경로 / 해석 [매개 변수-인수]

맨 윗줄은 GNU / Linux 용 쉘 스크립트가 호출되는 기본 구조입니다. 해당 요소는 다음과 같이 설명 할 수 있습니다.

#! => 샤뱅

샤뱅 (#!) 생성되거나 생성 될 스크립트의 맨 위에는 파일이 그 뒤에 표시된 명령 인터프리터에 의해 공급 (해석 될) 명령 집합임을 운영 체제에 알려주는 스크립트. 문자 쌍 #! 실제로, 그것은 매직 넘버 XNUMX 바이트, 특수 마커 파일 유형 지정, 그리고 우리의 경우, 실행 가능한 쉘 스크립트. 샤방이 끝나 자마자 실행될 인터프리터가 위치한 경로와 해당 인터프리터의 이름. 즉, 이것은 인터프리터, 프로그래밍 언어 또는 유틸리티이든 상관없이 스크립트의 명령을 해석하는 프로그램의 경로입니다. 그런 다음이 쉘은 스크립트의 명령을 맨 위 (샤뱅 다음 줄)에서 시작하고 주석을 무시합니다. 약간 샤뱅 그들은 다음과 같을 수 있습니다 :

#! / bin / sh의
#! / bin / bash
#! / usr / bin / perl
#! / usr / bin / tcl
#! / bin / sed -f
#! / usr / awk -f

위에서 설명한 각 줄 (예제)은 다른 셸을 호출합니다. 라인 / 빈 / SH, 호출 껍질 기본적으로 (GNU / Linux 운영 체제의 배시) 또는 다른 유사. 사용 #! / bin / sh의, 기본값 본 쉘 UNIX 기반 운영 체제의 대부분의 상용 변형에서 스크립트는 Linux가 아닌 다른 운영 체제로 이식 가능이지만 BASH 관련 기능이 희생 되더라도 유사하거나 UNIX 또는 UNIX를 기반으로합니다. 그러나 시퀀스 "#! / Bin / sh" 규범에 부합 POSIX sh 표준.

그 주 샤뱅에 주어진 경로가 정확해야합니다, 그렇지 않으면 오류 메시지, 일반적으로 "명령어를 찾을수 없음", 스크립트 실행의 유일한 결과입니다. 캐릭터 쌍 기억 »#! « 스크립트가 일반 운영 체제 명령 세트로만 구성된 경우 즉, 내부 쉘 지시문을 사용하지 않는 경우 생략 할 수 있습니다. 그리고 다시 한 번 명심하십시오 »#! / Bin / sh« 기본 쉘 인터프리터를 호출합니다. »#! / Bin / bash« 그와 팀을 이루어 GNU / Linux 운영 체제.

인수와 관련하여 사용할 수있는 몇 가지가 있지만 가장 일반적인 것은 다음과 같습니다. "-이자형". 스크립트를 만드는 모든 명령의 실행 오류 확인o (실행 줄) 양성인 경우 강제 종료 및 종료, 전형적인 것은 "-에프" 파라 로드 할 스크립트 표시 그리고 가장 희귀 한 것 중 하나는 »-Rm« 실행이 완료되면 삭제를 수행합니다. 다음에서만 지정할 수 있습니다. 샤뱅 까지 단일 인수 (매개 변수) 실행할 프로그램의 이름 뒤에.

마지막으로 스크립트에 코드의 필수 부분에서 사용할 전역 변수, 실행 경로, 권한 부여 된 사용자, 스크립트 이름 등과 같은 이벤트의 유효성을 검사합니다. 그리고 끝 프로그램, 제작자, 조직 등의 데이터와 프로그램에 적용되는 라이선스.

내 조언 (모범 사례) 선택하기 위해 최고의 샤뱅 및 제목 쉘 스크립트 위치 :

#! / usr / bin / env bash

명령을 사용하는 이유 »환경« 운영 체제에 인터프리터가 기본적으로 지정된 정확한 경로와 함께 사용되도록 지정하여 샤뱅 그것은 그것의 이식성을 증가시킵니다. OS GNU / 리눅스 인터프리터 또는 프로그램은 동일한 경로를 갖습니다. 인수없이, 명령을 사용하는 것이 더 낫기 때문에 세트, 그와 함께 할 수 있기 때문에 일반 (-e) 또는 특정 (+ x / -x) 오류 유효성 검사, 또는 환경 (-i) 또는 특정 (-u / –unset) 변수에 대한 전역 사전 설정 지우기. 그리고 마지막으로 특정 (-o) 보완 조치 실행 스크립트 내부.

그래서 내 권장 헤더는 다음과 같습니다.

#! / usr / bin / env bash
# 운영 체제에서 절대 경로로 bash 인터프리터를 나타냅니다.

-o errexit 설정
# 명령 또는 실행 행이 실패 할 때 스크립트를 중지하고 닫으라고 지시합니다.

set -o 명사
# 스크립트가 선언되지 않은 변수를 사용하려고 할 때 중지하고 닫으라고 스크립트에 지시합니다.

-o pipefail 설정
# XNUMX이 아닌 종료 코드를 반환 한 마지막 주문의 종료 상태를 가져옵니다.

# 세트 -o xtrace
# 실행되는 것을 추적합니다. 디버깅에 유용합니다. 오류 만 확인하려면 활성화하십시오.

다음 권장 사항을 추가로 따르십시오.

01.-코드 입력 : 코드를 읽기 쉽게 만드는 것은 매우 중요하며 많은 사람들이 잊어 버리는 것 같습니다. 좋은 논리 구조를 눈에 띄는 데 필요한 들여 쓰기를 만드십시오.

02.-코드 섹션 사이에 공백 추가 : 모듈이나 섹션으로 간격을두면 코드를 읽기 쉽고 이해하기 쉽기 때문에 코드를 훨씬 더 이해하기 쉽게 만들 수 있습니다.

03.-코드에 대해 가능한 한 많은 주석을 달아주세요 : 각 명령 순서 (실행 줄) 또는 코드 섹션의 맨 위 (또는 맨 아래)에 스크립트 기능에 대한 설명을 추가하여 코드 자체 내에서 일어나는 일을 설명하는 것이 이상적입니다.

04.-함수를 설명하는 이름으로 변수를 만듭니다. 생성 될 함수를 명확하게 식별하는 설명 변수 이름을 지정하십시오. 단일 코드 블록 외부에서는 절대 사용되지 않는 임시 변수를 만들지 만, 처리하는 값이나 함수를 암시 적으로 (객관적으로) 설명하는 이름을 지정하는 것이 좋습니다.

05.- 명령 대체를 위해 VARIABLE = $ (명령) 구문을 사용하십시오. 값이 다른 명령에서 파생 된 변수를 만들려면 bash에서 수행하는 두 가지 방법이 있습니다. 와 백틱즉, 문자 `` , jm : VARIABLE =`명령-옵션 매개 변수`이지만 이미 사용되지 않으므로 구문은 VARIABLE = $ (명령) 가장 현대적이고 수용되고 권장되는 방법입니다. 아니오-> DATE =`date + % F` / YES-> DATE = $ (날짜 + % F)

06.- 비밀번호 유무에 관계없이 수퍼 유저 및 인증 된 사용자 유효성 검사 모듈 및 / 또는 변수 사용 : 필요한 경우 보안 수준을 높이기 위해.

07.- 운영 체제 유효성 검사 모듈 및 / 또는 변수 사용 (Distro, 버전, 아키텍처) : 부적합한 플랫폼에서의 사용을 방지합니다.

08.- 모듈 (절차 / 섹션)을 사용하여 중요 또는 배치 작업 (모듈 / 기능)의 실행을 확인합니다. 즉흥 또는 부주의로 인한 실수를 최소화합니다.

09.- 사용자 친화적 인 인터페이스 제공 (사용자 친화적) : 메뉴 및 색상이있는 터미널 별 다이얼로그Zenity, Gxmessage를 사용하는 기본 사용자를위한 그래픽 인터페이스. 그리고 가능하면 소리에 따라 인식 가능한 이벤트를 식별하는 소리 경고 지원을 사용하십시오. 나는 당신의 스크립트가 옵션 / 모듈 / 기능을 활성화 및 비활성화하여 양방향으로 작동합니다.

10.-환영 및 작별 모듈 (메시지) 포함 : 사용자와의 상호 작용을 높이기 위해 필요한 경우.

11.-이중 실행 확인 모듈 포함 : 동시에 두 번 이상 실행되지 않도록 잠금 파일을 만듭니다.

12.-외부 함수 및 / 또는 모듈로 스크립트 크기 합리화 : 스크립트가 매우 크면 함수를 사용하여 코드를 나누거나 기본 스크립트를 통해 호출되는 작은 스크립트로 나눕니다.

13.- 스크립트 내에서 다른 통역사 (프로그래밍 언어)에 대한 호출을 명확하고 분명하게 호출합니다. 라인이나 모듈로 명확하게 초대하십시오.

예 :

# ================================================== #
#!/bin/bash
#Llamando a un interprete externo a BASH
echo 'El siguiente texto será mostrado por el interprete de PERL'
perl -e 'print "Este texto es mostrado por un script PERL embebido.\n";'
exit 0
# ==================================================#
# ==================================================# 
#!/bin/bash #Llamando al interprete de Python. 
echo 'El siguiente es un script de python:'
echo print "Hola, mundo!" | tee $HOME/.testpythonbash.py
python $HOME/.testpythonbash.py exit 0
# ==================================================#

# ======================================================= #
#!/bin/bash
# bash-y-perl.sh

echo "Saludos desde la parte BASH del script."
# Es posible añadir mas comandos BASH aqui.

exit 0
# Fin de la parte BASH del script.

###########################################################

#!/usr/bin/perl
# Esta parte del script se invoca con la opcion -x.

print "Saludos desde la parte PERL del script.\n";
# Podemos añadir mas comandos PERL aqui.

# Fin de la parte PERL del script.
# ======================================================= #
 

향후 간행물에서는 위에서 설명한 각 관행을 더 자세히 확장 할 것입니다.

그리고 당신 자신이나 다른 사람들이 다른 좋은 관행을 알고 있다면 주저하지 말고 더 완전한 개요를 만들기 위해 그것에 대해 언급하십시오!

이 새로운 시리즈의 다음 발행까지.


코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   Max j ​​Rodriguez

    하나의 세부 사항, "shebang"입니다 😛
    아주 좋은 게시물, 장기적으로 좋은 관행은 항상 표준화에 도움이됩니다.

  2.   여기 지나간 하나

    Bash는 모든 배포판에서 기본 셸이 아니므로 / bin / sh 심볼릭 링크가 항상 bash를 가리키는 것은 아닙니다. 예를 들어 Debian에서 (그러므로 Ubuntu라고 가정합니다) :
    $ ls -l / bin / sh
    lrwxrwxrwx 1 루트 루트 4 aza 8 2014 / bin / sh-> 대시
    따라서 Debian의 기본 셸은 dash입니다. 여길 봐: https://wiki.debian.org/Shell

  3.   이름이없는

    사용중인 셸을 알기위한 팁 :

    에코 $ 0
    에코 $ 쉘
    env | 그렙 쉘

  4.   잉. 호세 앨버트

    당신이 정말로 옳습니다! 저는 DEBIAN 9와 Kali Linux 2.0에서 테스트했는데 사실입니다! 대시로 이동합니다. 더 많은 권장 사항은 다음과 같습니다. #! / Usr / bin / env bash 사용하려는 쉘인 경우.

    그리고 당신은 절대적으로 옳은 것이 shebang이지만 일부 웹 사이트 (기술 문헌)에서는 shabang 또는 다른 단어라고 부르기 때문에 혼란 스럽습니다. 예:

    컴퓨팅에서 shebang은 스크립트 시작 부분에있는 문자 숫자 기호와 느낌표 (#!)로 구성된 문자 시퀀스입니다. sha-bang, [1] [2] hashbang, [3] [4] pound-bang, [5] 또는 hash-pling이라고도합니다.

    보낸 사람 : https://en.wikipedia.org/wiki/Shebang_%28Unix%29

    Y 2 장. 샤뱅으로 시작하기
    보낸 사람 : http://www.tldp.org/LDP/abs/html/sha-bang.html

  5.   잉. 호세 앨버트

    또한 : 기본 이름 $ 0