쉘 스크립트의 사용자 구성. 모범 사례?


13

사용자가 구성 해야하는 몇 가지 변수가있는 쉘 스크립트를 작성 중입니다. 스크립트를 다운로드하고 구성하기위한 설치 프로그램이있을 것입니다. 일련의 질문을 할 수도 있습니다. 문제의 스크립트는 다른 개발자를 대상으로합니다.

여러 가지 방법으로 구현할 수 있습니다.

  1. 스크립트 자체에서 자리 표시자를 사용 sed하고 설치 중에이를 대체하는 데 사용 하십시오 ( /programming/415677/how-to-replace-placeholders-in-a-text-file )

    • 장점 : 모든 변수 정의는 스크립트 내에 포함되어 있습니다. 스크립트를 수동으로 쉽게 다운로드하고 설치 프로그램보다 편집기를 선호하는 사용자를위한 변수를 구성 할 수 있습니다.

    • 단점 : 변수가 일단 설치되면 설치 프로그램을 통해 변수를 재구성하기가 어렵습니다. 오류가 발생하기 쉬운 복잡한 정규 표현식을 만들지 않으면

  2. 기본적으로 할당이있는 다른 쉘 스크립트 인 config 파일을 사용 source하여 포함 시키십시오. (그리고 아마도 그것을 배치 ~/.scriptname할까요? 메인 스크립트는에 복사됩니다 /usr/local/bin)

    • 장점 : 스크립트를 쉽게 재구성 할 수 있습니다. 기본 스크립트에서 매개 변수를 추가 할 수도 있습니다 (첫 번째 솔루션에서도 작동하지만 스크립트 자체를 편집하는 것은 좋은 생각이 아닙니다)

    • 단점 : 이제 스크립트는 두 파일에 종속되며 구성 파일을 만들려면 설치 관리자를 실행해야합니다. 구성 파일이 없으면 자동으로 생성하여 해결할 수 있습니다. 그러나 스크립트를 다운로드하고 편집하여 완료하려는 사용자에게는 외부 구성 파일을 찾는 것이 여전히 번거로울 것입니다.

또한 설치 후 사용자가 구성을 관리하는 방법에 관한 몇 가지 옵션이 있습니다.

  1. Git
    $ myscript config server.host example.org $ myscript config server.proxypath / home / johndoe / proxy $ myscript config 서버 .httppath / home / johndoe / web

  2. 대화식
    $ myscript config
    서버 호스트 이름을
    입력하십시오 . example.org 서버 에서 프록시의 경로를 입력하십시오. / home / johndoe / proxy
    서버에서 http 디렉토리의 경로를 입력하십시오. / home / johndoe / web

  3. 긴 옵션을 가진 getopts
    $ myscript --host example.org --proxypath / home / johndoe / proxy --httppath / home / johndoe / web

  4. 간단한
    $ myscript 설정 example.org / home / johndoe / proxy / home / johndoe / web

고려할 다른 방법이 있습니까?
모범 사례, 우아한 것이 있습니까?


2
이 모든 것을 수행하는 쉘 스크립트를 작성할 수 있다는 것은 의심의 여지가 없지만 쉘 스크립트에 설치 프로그램이 필요한 복잡한 무언가를 작성하려는 이유 는 문제입니다 . 어쨌든 Linux 커널 구성 시스템이 구성 파일을 관리하는 방법을 살펴보십시오.

잘. 'installer'스크립트는 실제 스크립트 만 다운로드하여 올바른 위치에 복사 한 후 구성에 대한 일련의 질문을합니다 (3-4 변수). 이 방법으로 사용자에게 단일 명령 줄을 제공하여 설치 스크립트를 가져 와서 / bin / sh로 파이프 할 수 있습니다. couse 때문에 설치 프로그램을 건너 뛰고 'install'매개 변수를 기본 스크립트에 추가하면됩니다. 더 나은 해결책은 무엇이라고 생각하십니까?
— Charlie Rudenstål

"하지만 질문은 왜 당신이 뭔가 복잡한 것을 쓰고 싶어하는지", 문제의 스크립트는 다음과 같습니다 : github.com/charlie-rudenstal/depo 새로운 사용자가 수행해야하는 단계, 특히 설치. 필요한 서버 설정을 자동으로 만드는 방법도 살펴보십시오.
— Charlie Rudenstål

답변:


6

제정신 프로그램 (쉘 스크립트)에서 무엇을 기대할 수 있습니까?

  • 나는 지금까지 결코 다만 그것을 구성하는 실행 파일을 변경할 필요가 없습니다. 이것은 OS 커널이 아닙니다.
  • 명령 줄을 사용하여 모든 설정을 전달할 수 있습니다. 이는 합리적인 불이행이 아닌 모든 정보에 반드시 필요합니다. 대화식 입력이 필요한 비밀번호는 예외입니다.
  • 선택적으로 환경 변수를 사용하여 설정을 전달할 수 있습니다.
  • 설정을 구성 파일에 기록 할 수 있으며이 파일이 잘 알려진 이름으로 존재하거나 위의 두 가지 방법을 사용하여 명시 적으로 지정된 경우이 파일이 사용됩니다.
  • 구성 파일은 명령 줄과 동일한 설정 이름과 구문을 사용합니다.

훌륭한 조언. 이것이 당신이 선호하는 주문입니까? (1) 명령 줄에서 전달 된 설정 확인 (2) 동일한 디렉토리의 .scriptnameConfig에서 설정 확인 (3) 환경 변수의 설정 확인 (4) ~ / .scriptnameConfig에서 .scriptnameConfig의 설정 확인 (5) 기본값 사용 설정
— Charlie Rudenstål

"설정 파일은 명령 줄과 동일한 설정 이름과 구문을 사용합니다." -어떻게 보입니까? 정규 쉘 스크립트에 할당 구문을 사용하려고했습니다 : SETTING = VALUE. 구문 파일과 같은 명령이 구성 파일 내에서 약간 이상하게 느껴지지 않습니까?
— Charlie Rudenstål

명령 행 및 구성에서 동일한 구문을 사용 하는 방법 mount또는 ssh허용 방법을 참조하십시오 . 명령 행 구문을 완전히 복사 할 필요는 없습니다. '--foo = bar'대신 'foo = bar'를 사용할 수 있습니다. 대신 'BarOption : Foo'를 사용하면 훨씬 편리하지 않습니다. 대소 문자가 중요한지, 파일에서 어떤 키워드가 허용되는지, 명령 줄에서 어떤 키워드가 허용되는지, 작업중인 명령을 복사하여 붙여 넣을 수없는 경우를 기억해야합니다. 외형 편집만으로 구성 파일에 줄을 바꿉니다.
— 9000

3

다양한 구성 옵션으로 정교한 스크립트를 작성해야 할 때 argparse 및 ConfigParser 라이브러리 와 함께 Python을 사용합니다 . 그것들은 구현에 도움이되지만 프로세스는 모든 쉘 스크립트에 적용됩니다.

  1. 구성 파일을 찾으십시오. 존재하는 경우 사전 / 조회 테이블에있는 설정을 읽으십시오.
  2. 명명 된 명령 줄 인수를 구문 분석합니다. 제공된 각 인수에 대해 구성 파일에서로드 된 값이 있으면이를 대체하십시오. 명령 행에 전달되지 않고 구성에 포함되지 않은 인수에 대해서는 기본값을 사용하십시오.
  3. 스크립트의 주요 기능을 실행
  4. 구성 파일이 존재하지 않으면 전달 된 값 및 / 또는 기본값을 파일에 쓰십시오.

스크립트를 반복적으로 사용하려고 할 때 구성 파일이 선호하는 옵션을 유지하지만 명령 줄 인수를 재정의하는 것이 좋습니다. 처음 실행될 때 해당 매개 변수를 사용하여 구성 파일을 작성하십시오. 그런 다음 구성 파일을 공유하고 코드 저장소로 커밋 할 수 있습니다.

가장 최근의 경우 [DEFAULT]에는 구성 파일의 맨 위에 있는 섹션에 기본값을 쓴 다음 각 "환경"에 대한 섹션을 각각 적절하게 재정의했습니다. "environment"는 스크립트에 이름이 지정되지 않은 첫 번째 매개 변수입니다. 따라서이 경우 매개 변수는 기본 제공 기본값 -> 구성 파일 기본값 -> 구성 파일 섹션 값 -> 명령 행 매개 변수로 선택 됩니다. 추가 명령 줄 매개 변수는 기존 구성을 최신 실행 값으로 덮어 쓸 수있는 옵션을 제공합니다. 이 구성 파일은 현재 디렉토리에 작성되므로 프로젝트마다 적용되며 나머지 코드로 커밋 할 수 있습니다. 동일한 프로젝트를 체크 아웃하는 다른 사람은 동일한 구성으로 시작합니다.


"추가 명령 줄 매개 변수는 기존 구성을 최신 실행 값으로 덮어 쓸 수있는 옵션을 제공합니다." 이것은 흥미로운 접근법입니다. 매개 변수를 구성과 결합하는 편리한 방법입니다.
— Charlie Rudenstål

+1 또한 default.config스크립트와 동일한 디렉토리 에있는 파일 에서 기본값을 설정 한 다음 ~/.scriptname이 값을 무시할 구성 파일을 찾는 것이 좋습니다 . 이렇게하면 모든 값에 유효한 기본값이 있으며 유지 관리가 더 쉽습니다.
— Aaron

2

자리 표시자를 편집하면 오류가 발생하기 쉽습니다.

구성 파일을 사용합니다.

의존성에 대한 귀하의 우려는 유효하지만 단일 파일로 구성된 너무 많은 도구를 사용하는 것을 기억하지 못합니다. 이론적으로는 정확하지만 실제로는 괜찮습니다.

세 번째 옵션은 구성 소프트웨어를 만드는 것입니다 쓰기 선택한 옵션과 매개 변수에 특정한 새로운 맞춤형 버전을. 물론 작성하고 테스트하기가 더 어려울 수 있습니다. :)

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