Bash Shebang cho người giả?


36

Tôi có một số tập lệnh bash tôi đã thiết lập chủ yếu sử dụng

#!/bin/bash

nhưng tôi thường xuyên bắt gặp một số

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

vân vân

Ai đó có thể giải thích ý nghĩa và lợi ích của các tùy chọn shebang này và liệu chúng có áp dụng cho các shebang khác không?


Các tùy chọn này dành riêng cho Bash (hoặc thông dịch viên khác). Chúng có thể giống nhau cho các shell khác (ví dụ dash và ksh), nhưng chúng sẽ khác nhau đối với các trình thông dịch khác như AWK và Python. Bạn có thể sử dụng nhiều tùy chọn mà trình thông dịch chấp nhận. Các tùy chọn là thông dịch cụ thể trong khi shebang là một tính năng kernel.
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


41

Nếu một kịch bản /path/to/foobắt đầu bằng #!/bin/bash, thì thực thi /path/to/foo arg1 arg2là tương đương với thực thi /bin/bash /path/too/foo arg1 arg2. Nếu dòng shebang là #!/bin/bash -ex, nó tương đương với thực thi /bin/bash -ex /path/too/foo arg1 arg2. Tính năng này được quản lý bởi kernel.

Lưu ý rằng bạn chỉ có thể có một đối số trên dòng shebang: một số thông báo (chẳng hạn như Linux) chỉ chấp nhận một đối số, do đó #!/bin/bash -e -xsẽ dẫn đến bash nhận đối số năm ký tự -e -x(lỗi cú pháp) thay vì hai đối số -e-x.

Đối với hệ vỏ Bourne shvà các vỏ có nguồn gốc như POSIX sh, bash, ksh và zsh:

  • -e có nghĩa là nếu bất kỳ lệnh nào thất bại (mà nó chỉ ra bằng cách trả về trạng thái khác không), tập lệnh sẽ chấm dứt ngay lập tức.
  • -x làm cho vỏ để in một dấu vết thực hiện.

Các chương trình khác có thể hiểu các tùy chọn này nhưng với ý nghĩa khác nhau.


24

Chúng là các tùy chọn được thông qua để bashxem help setthêm thông tin, trong trường hợp này:

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.

3
+1 và -exthực hiện cả hai
Nifle

Thật khó hiểu vì chúng trông giống như các tùy chọn dòng lệnh được truyền vào Bash.
Caoilte

2
@Caoilte: Và thực sự họ là (từ man bash) : In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...].
cYrus

1
mảng! nháy mắt và bạn nhớ nó :).
Caoilte

0

Tôi chỉ muốn đề cập đến một lựa chọn thậm chí còn tốt hơn - như trong di động hơn - thay thế:

#!/usr/bin/env bash

Ví dụ trên sử dụng envđể tìm bashtệp thực thi, không phải lúc nào cũng có /bin/bash. Các #!/bin/bashkịch bản cũ không hoạt động trên NixOS , ví dụ.

Nếu bạn sử dụng envnhư trình bày ở trên, bạn không thể cung cấp cho một cuộc tranh cãi như -eđể bash(như xa như tôi biết). Nhưng bạn có thể làm điều này thay vào đó:

#!/usr/bin/env bash
set -e

2
Tôi làm điều này mọi lúc, nhưng tôi sẽ không nói đó là một chiếc máy tính xách tay nhiều hơn - thực tế, nguy cơ người dùng chạy một thứ gì đó hoàn toàn khác (so với những gì bạn có thể giả sử là một hệ thống đi kèm) là lớn hơn nhiều. Ví dụ: Ubuntu vẫn phát hành Bash 4, trong khi người dùng có thể chọn chạy Bash 5.
slhck

Phải, envviệc sử dụng không tốt, đặc biệt đối với các tập lệnh chạy python vì đơn giản là bạn không biết liệu mặc định pythonlà phiên bản 2 hay 3 và điều đó tạo ra một thế giới khác biệt cho các tập lệnh cần một phiên bản cụ thể. Tốt hơn là rõ ràng hơn xảo quyệt
smac89
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.