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


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

다양한 구성 옵션으로 정교한 스크립트를 작성해야 할 때 argparseConfigParser 라이브러리 와 함께 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.