Điểm:0

Làm cách nào để chuyển đổi tập lệnh BASH thành DASH hoặc các giải pháp khác?

lá cờ ng

Tôi đang tạo gói nhà phân phối AWS để sửa đổi cấu hình nhật ký hệ thống trên các phiên bản khác nhau của máy chủ Linux. Tôi đã viết một vài tập lệnh bash đơn giản để xử lý việc cài đặt, gỡ cài đặt và cập nhật. Tôi nghĩ rằng điều này sẽ là phổ quát. Tuy nhiên, hôm nay tôi phát hiện ra rằng AWS sử dụng sh để thực thi tập lệnh (tức là sh cài đặt.sh) và trên Ubuntu/Debian, điều này mặc định là DASH chứ không phải BASH. Vì lý do đó, tập lệnh của tôi không thành công với:

lỗi cập nhật: update.sh: 3: update.sh: chức năng: không tìm thấy

update.sh: 9: update.sh: Lỗi cú pháp: "}" không mong muốn

không thể chạy lệnh: thoát trạng thái 2

Không thể cài đặt gói; trạng thái cài đặt Không thành công

Tôi không thể thay đổi hành vi AWS. Và tôi không muốn sửa đổi bất kỳ cấu hình nào trên máy chủ. Vì vậy, có vẻ như các tùy chọn duy nhất của tôi là tùy chọn sửa đổi chính tệp script?

Ưu tiên đầu tiên là làm cho tập lệnh trở nên phổ biến để nó có thể chạy trên bất kỳ hương vị nào của Linux. Tùy chọn thứ hai là tạo một tập lệnh khác cho Debian tương thích với DASH.

Thật không may, tôi không tìm thấy nhiều thông tin về lập trình dấu gạch ngang. Bất kỳ đề xuất?

3 kịch bản trong câu hỏi là ....

cài đặt.sh

#!/bin/bash

chức năng được cài đặt {
  nếu sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; sau đó
    thật
  khác
    sai
  fi
}

nếu được cài đặt; sau đó
  thoát 0
khác
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  khởi động lại dịch vụ sudo rsyslog
fi

gỡ cài đặt.sh

#!/bin/bash

chức năng được cài đặt {
  nếu sudo ls /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; sau đó
    thật
  khác
    sai
  fi
}

nếu được cài đặt; sau đó
  sudo rm /etc/rsyslog.d/xdr.conf
  khởi động lại dịch vụ sudo rsyslog
khác
  thoát 0
fi

cập nhật.sh

#!/bin/bash

hàm isDiff {
  nếu Sudo diff xdr.conf /etc/rsyslog.d/xdr.conf >/dev/null 2>&1; sau đó
    sai
  khác
    thật
  fi
}

nếu làDiff; sau đó
  sudo cp xdr.conf /etc/rsyslog.d/xdr.conf
  khởi động lại dịch vụ sudo rsyslog
khác
  thoát 0
fi
lá cờ ph
Nếu bạn thay đổi shebang thành `#!/bin/sh`, [shellcheck.net](https://www.shellcheck.net) sẽ chỉ ra rằng bạn đang sử dụng cú pháp không chuẩn để xác định chức năng của mình. Ngoài ra, hãy xem ["Dash as /bin/sh"](https://wiki.ubuntu.com/DashAsBinSh) trong Ununtu wiki và công cụ `checkbashisms` mà nó mô tả.
Điểm:1
lá cờ us

Có hai cú pháp hàm khác nhau trong bash/ksh/zsh. Bạn đang sử dụng kiểu ksh: tên hàm { ⦠}. Các hình thức khác chỉ là tên() { ⦠} và là hình thức được giới thiệu muộn trong vỏ Bourne ban đầu.

Nó thực sự là vô nghĩa để làm:

    nếu cmd; sau đó
      thật
    khác
      sai
    fi

Ngoài việc chuyển tất cả các trạng thái trả về khác không thành 1, điều này cũng giống như chỉ chạy cmd. Và với chức năng được giảm xuống chỉ còn một dòng, bạn thực sự không cần chức năng. Tôi cũng muốn sử dụng cmp -s thay vì khác biệt hoặc đơn giản là sao chép vô điều kiện. Và không sử dụng ls để kiểm tra sự tồn tại của một tập tin. Hoặc là kiểm tra lệnh hoặc [ được dành cho mục đích đó: [ -e /etc/rsyslog.d/xdr.conf ]. Điều đó tồn tại ở dạng bên ngoài nếu bạn có sudo.

Appleoddity avatar
lá cờ ng
Chào. Tôi sẽ xem xét các đề xuất của bạn để so sánh/kiểm tra các tệp. Tuy nhiên, mục đích của thử nghiệm là vì tôi không muốn daemon nhật ký hệ thống luôn được khởi động lại. Tập lệnh này là thứ sẽ chạy hàng ngày để đảm bảo rằng phiên bản được định cấu hình và/hoặc cập nhật nếu cấu hình thay đổi. Nó sẽ thoát với mã 0 để AWS cho rằng nó ổn. Hoặc một mã khác không để chỉ ra một vấn đề.
lá cờ ph
@Appleoddity Vấn đề là ví dụ: chức năng `isInstalled` chỉ có thể được định nghĩa là `isInstalled() { [ -e /etc/rsyslog.d/xdr.conf ]; }` -- nó sẽ trực tiếp trả về trạng thái của bài kiểm tra mà không cần `if`, `true`, `false`, v.v. Hoặc, bạn có thể hoàn toàn bỏ qua chức năng này và trong phần chính của tập lệnh, hãy sử dụng `if [ -e /etc/rsyslog.d/xdr.conf ]; thì ...`.
Appleoddity avatar
lá cờ ng
@GordonDavisson được rồi. Cảm ơn bạn. Tôi sẽ phải thực hiện một số nghiên cứu để hiểu rõ hơn về cú pháp này. Bạn có gợi ý rằng cú pháp này sẽ tương thích với bash và dash không?
lá cờ ph
@Appleoddity Có, cú pháp đó sẽ hoạt động trong mọi trình bao tuân thủ POSIX (bash, dash, ksh, v.v.) và tôi nghĩ rằng ngay cả các trình bao kiểu Bourne trước POSIX (nhưng không phải với các trình bao không phải kiểu Bourne như csh hoặc cá) .

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.