Score:0

จะแปลงสคริปต์ BASH เป็น DASH หรือโซลูชันอื่นได้อย่างไร

ธง ng

ฉันกำลังสร้างแพ็คเกจผู้จัดจำหน่าย AWS เพื่อแก้ไขการกำหนดค่า syslog บนเซิร์ฟเวอร์ Linux รุ่นต่างๆ ฉันเขียนสคริปต์ทุบตีง่ายๆ สองสามตัวเพื่อจัดการการติดตั้ง ถอนการติดตั้ง และอัปเดต ฉันคิดว่านี่จะเป็นสากล อย่างไรก็ตาม วันนี้ฉันพบว่า AWS ใช้ เพื่อดำเนินการสคริปต์ (เช่น sh install.sh) และบน Ubuntu/Debian ค่าดีฟอลต์จะเป็น DASH ไม่ใช่ BASH ด้วยเหตุนี้สคริปต์ของฉันจึงล้มเหลวด้วย:

ข้อผิดพลาดในการอัปเดต: update.sh: 3: update.sh: ฟังก์ชัน: ไม่พบ

update.sh: 9: update.sh: ข้อผิดพลาดทางไวยากรณ์: "}" ที่ไม่คาดคิด

ไม่สามารถเรียกใช้คำสั่ง: ออกจากสถานะ 2

ติดตั้งแพ็คเกจไม่สำเร็จ สถานะการติดตั้งล้มเหลว

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

การตั้งค่าแรกคือการทำให้สคริปต์เป็นสากลเพื่อให้สามารถทำงานบน Linux ได้ทุกรสชาติ การตั้งค่าที่สองคือการสร้างสคริปต์อื่นสำหรับ Debian ที่เข้ากันได้กับ DASH

ขออภัย ฉันไม่พบข้อมูลเกี่ยวกับการเขียนโปรแกรม dash มากนัก ข้อเสนอแนะใด ๆ

3 สคริปต์ที่เป็นปัญหาคือ....

ติดตั้ง.sh

#!/bin/bash

ฟังก์ชันติดตั้ง {
  ถ้า sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; แล้ว
    จริง
  อื่น
    เท็จ
  ไฟ
}

ถ้าติดตั้ง; แล้ว
  ทางออก 0
อื่น
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  บริการ sudo rsyslog รีสตาร์ท
ไฟ

ถอนการติดตั้ง.sh

#!/bin/bash

ฟังก์ชันติดตั้ง {
  ถ้า sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; แล้ว
    จริง
  อื่น
    เท็จ
  ไฟ
}

ถ้าติดตั้ง; แล้ว
  sudo rm /etc/rsyslog.d/xdr.conf
  บริการ sudo rsyslog รีสตาร์ท
อื่น
  ทางออก 0
ไฟ

update.sh

#!/bin/bash

ฟังก์ชัน isDiff {
  ถ้า sudo diff xdr.conf /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; แล้ว
    เท็จ
  อื่น
    จริง
  ไฟ
}

ถ้า isDiff; แล้ว
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  บริการ sudo rsyslog รีสตาร์ท
อื่น
  ทางออก 0
ไฟ
ph flag
หากคุณเปลี่ยน shebang เป็น `#!/bin/sh` [shellcheck.net](https://www.shellcheck.net) จะชี้ให้เห็นว่าคุณกำลังใช้ไวยากรณ์ที่ไม่เป็นมาตรฐานในการกำหนดฟังก์ชันของคุณ นอกจากนี้ โปรดดู ["Dash as /bin/sh"](https://wiki.ubuntu.com/DashAsBinSh) ใน Ununtu wiki และเครื่องมือ `checkbashisms` ที่อธิบายไว้
Score:1
ธง us

มีไวยากรณ์ของฟังก์ชันที่แตกต่างกันสองแบบใน bash/ksh/zsh คุณกำลังใช้สไตล์ ksh: ชื่อฟังก์ชัน { ⦠}. อีกรูปแบบหนึ่งเป็นเพียง ชื่อ() { ⦠} และเป็นรูปแบบที่นำมาใช้ในช่วงเริ่มต้นของเชลล์เป้าหมาย

มันไม่มีประโยชน์ที่จะทำ:

    ถ้า cmd; แล้ว
      จริง
    อื่น
      เท็จ
    ไฟ

นอกเหนือจากการเปลี่ยนสถานะการคืนค่าที่ไม่ใช่ศูนย์ทั้งหมดเป็น 1 แล้ว ยังเหมือนกับการเรียกใช้ ซม. และด้วยฟังก์ชันที่ลดลงเหลือเพียงหนึ่งบรรทัด คุณไม่จำเป็นต้องมีฟังก์ชัน ฉันยังถูกล่อลวงให้ใช้ ซม. -s แทน ความแตกต่าง หรือเพียงแค่ทำสำเนาโดยไม่มีเงื่อนไข และอย่าใช้ เพื่อทดสอบการมีอยู่ของไฟล์ ไม่ว่าจะเป็น ทดสอบ คำสั่งหรือ [ มีไว้เพื่อการนั้น: [ -e /etc/rsyslog.d/xdr.conf ]. ที่มีอยู่ในรูปแบบภายนอกถ้าคุณมี ซูโด.

Appleoddity avatar
ng flag
สวัสดี. ฉันจะนำคำแนะนำของคุณไปพิจารณาเปรียบเทียบ/ทดสอบไฟล์ แต่จุดประสงค์ของการทดสอบคือเพราะฉันไม่ต้องการให้ syslog daemon เริ่มต้นใหม่เสมอ สคริปต์นี้เป็นสิ่งที่จะทำงานทุกวัน โดยเป็นส่วนหนึ่งของการตรวจสอบให้แน่ใจว่าอินสแตนซ์ได้รับการกำหนดค่าและ/หรืออัปเดตหากการกำหนดค่ามีการเปลี่ยนแปลง ควรออกด้วยรหัส 0 เพื่อให้ AWS คิดว่าใช้ได้ หรือรหัสที่ไม่ใช่ศูนย์เพื่อระบุปัญหา
ph flag
@Appleoddity ประเด็นก็คือเช่น ฟังก์ชัน `isInstalled` สามารถกำหนดเป็น `isInstalled() { [ -e /etc/rsyslog.d/xdr.conf ]; }` -- มันจะส่งคืนสถานะของการทดสอบโดยตรง โดยไม่จำเป็นต้องใช้ `if`, `true`, `false` ฯลฯ หรือคุณสามารถข้ามฟังก์ชันนี้ไปเลยก็ได้ และในส่วนหลักของสคริปต์ ให้ใช้ `if [ -e /etc/rsyslog.d/xdr.conf ]; แล้ว...`.
Appleoddity avatar
ng flag
@GordonDavisson ตกลง ขอขอบคุณ. ฉันจะต้องทำการวิจัยเพื่อให้เข้าใจไวยากรณ์นี้ได้ดีขึ้น คุณกำลังแนะนำว่าไวยากรณ์นี้จะเข้ากันได้กับ bash และ dash หรือไม่
ph flag
@Appleoddity ใช่ ไวยากรณ์นั้นควรทำงานในเชลล์ที่สอดคล้องกับ POSIX (bash, dash, ksh ฯลฯ) และฉันคิดว่าแม้แต่เชลล์สไตล์บอร์นก่อน POSIX (แต่ไม่ใช่กับเชลล์ที่ไม่ใช่สไตล์บอร์น เช่น csh หรือปลา) .

โพสต์คำตอบ

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