การกำหนดค่าผู้ใช้ของเชลล์สคริปต์ ปฏิบัติที่ดีที่สุด?


13

ฉันกำลังเขียนเชลล์สคริปต์ด้วยตัวแปรบางตัวที่ควรกำหนดค่าโดยผู้ใช้ จะมีโปรแกรมติดตั้งสำหรับดาวน์โหลดและกำหนดค่าสคริปต์โดยอาจถามคำถามหลายข้อ สคริปต์ที่เป็นปัญหานั้นมุ่งเป้าไปที่ผู้พัฒนารายอื่น

สิ่งนี้สามารถนำไปใช้ได้หลายวิธี:

  1. ใช้ตัวยึดตำแหน่งในสคริปต์และใช้sedเพื่อแทนที่ในระหว่างการติดตั้ง (สิ่งนี้: /programming/415677/how-to-replace-placeholders-in-a-text-file )

    • ข้อดี: คำจำกัดความของตัวแปรทั้งหมดมีอยู่ในสคริปต์ ง่ายในการดาวน์โหลดสคริปต์ด้วยตนเองและกำหนดค่าตัวแปรสำหรับผู้ใช้ที่ต้องการตัวแก้ไขมากกว่าตัวติดตั้ง

    • ข้อด้อย: มันยากที่จะกำหนดค่าตัวแปรใหม่ผ่านตัวติดตั้งเมื่อมีอยู่ นอกจากว่าฉันจะสร้าง regexp ที่ซับซ้อนมากขึ้นซึ่งจะมีแนวโน้มที่จะเกิดข้อผิดพลาด

  2. ใช้ไฟล์ configโดยทั่วไปแล้วเชลล์สคริปต์อื่นที่มีการมอบหมายและใช้sourceเพื่อรวมไฟล์นั้น (และอาจวางไว้ใน~/.scriptname? สคริปต์หลักถูกคัดลอกไปยัง/usr/local/bin)

    • ข้อดี: ง่ายต่อการกำหนดค่าสคริปต์ใหม่ สามารถเพิ่มพารามิเตอร์สำหรับการทำเช่นนั้นได้จากสคริปต์หลัก (อาจเป็นไปได้ในโซลูชันแรกเช่นกัน แต่การแก้ไขสคริปต์จากตัวเองไม่ได้ฟังดูเหมือนเป็นความคิดที่ดีมาก)

    • ข้อด้อย: สคริปต์นี้ขึ้นอยู่กับสองไฟล์และผู้ใช้จำเป็นต้องเรียกใช้โปรแกรมติดตั้งสำหรับไฟล์การกำหนดค่าที่จะสร้าง สิ่งนี้สามารถแก้ไขได้โดยการสร้างไฟล์ปรับแต่งอัตโนมัติหากไม่มีอยู่ แต่การค้นหาไฟล์กำหนดค่าภายนอกจะยังคงเป็นเรื่องยุ่งยากสำหรับผู้ใช้ที่ต้องการดาวน์โหลดสคริปต์แก้ไขและดำเนินการกับมัน

นอกจากนี้ยังมีตัวเลือกเล็กน้อยเกี่ยวกับวิธีการจัดการการกำหนดค่าโดยผู้ใช้หลังการติดตั้ง:

  1. คอมไพล์เช่น
    $ myscript config server.host example.org $ myscript config server.proxypath / home / johndoe / proxy $ myscript config server.httppath / home / johndoe / เว็บ

  2. การกำหนดค่า
    $ myscript แบบโต้ตอบ
    ป้อนชื่อโฮสต์เซิร์ฟเวอร์: 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 config example.org / home / johndoe / proxy / home / johndoe / เว็บ

มีวิธีอื่นอีกไหมในการทำสิ่งนี้ที่คุณจะพิจารณา?
มีแนวปฏิบัติที่ดีที่สุดมีอะไรที่งดงาม?


2
ฉันไม่สงสัยเลยว่าคุณสามารถเขียนเชลล์สคริปต์ที่ทำสิ่งนี้ทั้งหมด แต่คำถามคือสาเหตุที่คุณต้องการเขียนบางสิ่งที่ซับซ้อนเนื่องจากต้องใช้ตัวติดตั้งในเชลล์สคริปต์ อย่างไรก็ตามดูว่าระบบกำหนดค่าเคอร์เนล Linux จัดการไฟล์กำหนดค่าอย่างไร

ดี. สคริปต์ 'ตัวติดตั้ง' จะดาวน์โหลดสคริปต์จริงคัดลอกไปยังตำแหน่งที่ถูกต้องและถามคำถามชุดสำหรับการกำหนดค่า (ตัวแปร 3-4 ตัว) ด้วยวิธีนี้ฉันสามารถให้บรรทัดคำสั่งเดียวแก่ผู้ใช้การรับสคริปต์การติดตั้งและไพพ์ไปที่ / bin / sh แน่นอนว่าฉันสามารถข้ามโปรแกรมติดตั้งและเพิ่มพารามิเตอร์ 'ติดตั้ง' ลงในสคริปต์หลักได้ อาจจะเป็นทางออกที่ดีกว่าคุณคิดอย่างไร?
Charlie Rudenstål

"แต่คำถามคือเหตุผลที่คุณต้องการเขียนบางอย่างที่ซับซ้อน" นี่คือสคริปต์ในคำถาม: github.com/charlie-rudenstal/depoฉันพยายามลดจำนวนขั้นตอนที่ผู้ใช้ใหม่ต้องทำโดยเฉพาะในช่วง การติดตั้ง. มองหาการตั้งค่าเซิร์ฟเวอร์ที่ต้องการโดยอัตโนมัติเช่นกัน
Charlie Rudenstål

คำตอบ:


6

สิ่งที่ฉันคาดหวังจากโปรแกรมสติ (เชลล์สคริปต์หรือไม่):

  • ฉันไม่เคยมีการเปลี่ยนแปลงการปฏิบัติการเพื่อเพียงแค่กำหนดค่า นี่ไม่ใช่เคอร์เนลระบบปฏิบัติการ
  • ฉันสามารถผ่านการตั้งค่าใด ๆ โดยใช้บรรทัดคำสั่ง นี่เป็นสิ่งที่จำเป็นสำหรับข้อมูลทุกชิ้นที่ไม่มีค่าปริยาย ข้อยกเว้นเพียงอย่างเดียวคือรหัสผ่านที่ต้องการอินพุตแบบโต้ตอบ
  • เป็นทางเลือกฉันสามารถผ่านการตั้งค่าโดยใช้ตัวแปรสภาพแวดล้อม
  • ฉันสามารถเขียนการตั้งค่าลงในไฟล์กำหนดค่าและไฟล์นี้จะใช้หากมีอยู่ภายใต้ชื่อที่รู้จักกันดีหรือชี้ไปที่ชัดเจนโดยใช้สองวิธีข้างต้น
  • ไฟล์กำหนดค่าใช้ชื่อและไวยากรณ์การตั้งค่าเดียวกันกับบรรทัดคำสั่ง

คำแนะนำที่ดี นี่จะเป็นคำสั่งที่คุณต้องการหรือไม่? (1) ตรวจสอบการตั้งค่าที่ผ่านในบรรทัดคำสั่ง (2) ตรวจสอบการตั้งค่าใน. sscriptnameConfig ในไดเรกทอรีเดียวกัน (3) ตรวจสอบการตั้งค่าในตัวแปรสภาพแวดล้อม (4) ตรวจสอบการตั้งค่าใน. scriptnameConfig ใน ~ / .scriptnameConfig การตั้งค่า
Charlie Rudenstål

"ไฟล์ปรับแต่งใช้ชื่อและไวยากรณ์การตั้งค่าเดียวกันกับบรรทัดคำสั่ง" - วิธีนี้ควรจะดูอย่างไร ฉันจะใช้ไวยากรณ์การกำหนดค่าสำหรับเชลล์สคริปต์ปกติ: SETTING = VALUE คำสั่งจะไม่เหมือนไวยากรณ์รู้สึกแปลก ๆ เล็กน้อยในไฟล์ปรับแต่งหรือไม่
Charlie Rudenstål

ดูว่าmountหรือsshอนุญาตให้คุณใช้ไวยากรณ์เดียวกันบนบรรทัดคำสั่งและในการกำหนดค่า คุณไม่จำเป็นต้องคัดลอกไวยากรณ์บรรทัดคำสั่งทั้งหมด แทน '--foo = bar' คุณสามารถใช้ 'foo = bar' หากคุณใช้ 'BarOption: Foo' แทนจะสะดวกกว่านี้น้อยกว่า: ความจำเป็นที่จะต้องจำไว้ว่าตัวพิมพ์เล็กหรือใหญ่คำหลักใดที่ยอมรับได้ในไฟล์และบนบรรทัดคำสั่งและไม่สามารถคัดลอกคำสั่งทำงานได้ เข้าสู่ไฟล์ปรับแต่งด้วยการแก้ไขเครื่องสำอางเท่านั้น
9000

3

เมื่อฉันต้องเขียนสคริปต์ที่ซับซ้อนที่มีตัวเลือกการกำหนดค่าต่างๆที่ผมใช้งูหลามกับargparseและConfigParserห้องสมุด ความช่วยเหลือสำหรับการนำไปใช้ แต่กระบวนการใช้กับเชลล์สคริปต์ใด ๆ :

  1. ค้นหาไฟล์ปรับแต่ง หากมีอยู่ให้อ่านการตั้งค่าใด ๆ ที่มีอยู่ในตารางพจนานุกรม / ค้นหา
  2. แยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งที่ชื่อ สำหรับแต่ละอาร์กิวเมนต์ที่มีให้ให้แทนที่ค่าที่โหลดจากไฟล์กำหนดค่าหากมีอยู่ สำหรับอาร์กิวเมนต์ใด ๆ ที่ไม่ผ่านในบรรทัดคำสั่งและไม่ได้อยู่ในการกำหนดค่าให้ใช้ค่าเริ่มต้น
  3. ดำเนินการฟังก์ชันหลักของสคริปต์
  4. หากไม่มีไฟล์ config ให้เขียนค่าที่ส่งผ่านและ / หรือค่าเริ่มต้น

การตั้งค่าของฉันใช้สำหรับไฟล์ปรับแต่งเพื่อเก็บตัวเลือกที่ต้องการเมื่อสคริปต์กำลังจะถูกใช้ซ้ำ ๆ แต่ปล่อยให้อาร์กิวเมนต์บรรทัดคำสั่งใด ๆ แทนที่ เขียนไฟล์กำหนดค่าโดยใช้พารามิเตอร์เหล่านี้ในครั้งแรกที่เรียกใช้ จากนั้นไฟล์กำหนดค่าสามารถแชร์และกำหนดให้กับที่เก็บรหัส

ในกรณีล่าสุดของฉันฉันยังเขียนค่าเริ่มต้นไปยัง[DEFAULT]ส่วนที่ด้านบนของไฟล์กำหนดค่าจากนั้นมีส่วนสำหรับแต่ละ "สภาพแวดล้อม" ที่มีการแทนที่ที่เหมาะสมสำหรับแต่ละคน "environment" เป็นพารามิเตอร์แรกที่ไม่มีชื่อของสคริปต์ ดังนั้นในกรณีนี้พารามิเตอร์ที่เลือกให้เป็นตัวในการเริ่มต้น -> ไฟล์ config เริ่มต้น -> การตั้งค่าไฟล์ค่าส่วน -> พารามิเตอร์บรรทัดคำสั่ง พารามิเตอร์บรรทัดคำสั่งเพิ่มเติมให้ตัวเลือกที่จะเขียนทับการตั้งค่าที่มีอยู่กับค่าของการทำงานล่าสุด ไฟล์กำหนดค่านี้ถูกเขียนลงในไดเรกทอรีปัจจุบันเพื่อให้สามารถใช้ได้กับโปรเจ็กต์และสามารถกำหนดให้กับโค้ดที่เหลือ ใครก็ตามที่ตรวจสอบโครงการเดียวกันจะเริ่มต้นด้วยการกำหนดค่าเดียวกัน


"พารามิเตอร์บรรทัดคำสั่งเพิ่มเติมให้ตัวเลือกในการเขียนทับการกำหนดค่าที่มีอยู่ด้วยค่าการทำงานล่าสุด" นี่เป็นวิธีการที่น่าสนใจ วิธีที่สะดวกในการรวมพารามิเตอร์กับการกำหนดค่า
Charlie Rudenstål

+1 นอกจากนี้ฉันขอแนะนำให้ตั้งค่าเริ่มต้นในdefault.configไฟล์ที่อยู่ในไดเรกทอรีเดียวกับสคริปต์จากนั้นมองหาไฟล์~/.scriptnameกำหนดค่าที่เพื่อแทนที่ค่าเหล่านี้ วิธีนั้นทุกค่ามีค่าเริ่มต้นที่ถูกต้องและง่ายต่อการบำรุงรักษา
แอรอน

2

การแก้ไขตัวยึดตำแหน่งมีข้อผิดพลาดเกิดขึ้นได้ง่าย

ฉันจะไปกับการใช้ไฟล์กำหนดค่า

ความกังวลของคุณเกี่ยวกับการพึ่งพานั้นถูกต้องอย่างไรก็ตามฉันจำไม่ได้ว่าใช้เครื่องมือมากเกินไปที่ประกอบด้วยไฟล์เดียว ดังนั้นในทางทฤษฎีคุณถูกต้อง แต่ในทางปฏิบัติมันควรจะค่อนข้างโอเค

ตัวเลือกที่สามคือการทำให้ซอฟแวร์การกำหนดค่าเขียนรุ่นใหม่ที่เหมาะที่เป็นเฉพาะกับตัวเลือกที่เลือกและพารามิเตอร์ อาจเขียนและทดสอบได้ยากกว่านี้ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.