Làm thế nào để biết nếu extglob được kích hoạt trong phiên bash hiện tại?


9

Tôi có một thiết bị đầu cuối bash mở. Tôi muốn tìm hiểu xem tùy chọn extglob được bật hay tắt trong phiên này, trước khi tôi thay đổi giá trị của nó. Tôi có thể làm cái này như thế nào?


2
Lưu ý rằng không cần phải kiểm tra trừ khi bạn tò mò. Nếu bạn muốn nó, chỉ cần chạy shopt -s extglobhoặc, nếu bạn muốn nó tắt, chạy shopt -u extglob. Nó không tạo ra bất kỳ sự khác biệt nào nếu nó ban đầu hay không.
terdon

Câu trả lời:


15

Chỉ cần chạy:

$ shopt extglob

Nó sẽ trả về trạng thái hiện tại:

$ shopt extglob 
extglob         on
$ shopt -u extglob 
$ shopt extglob 
extglob         off

Để hiển thị tất cả các tùy chọn, chỉ cần chạy:

$ shopt

Cái này cũng có thể được sử dụng cho kịch bản, trạng thái trả về của nó cũng cho biết tùy chọn được đặt hoặc không được đặt, nhưng thông báo sẽ làm rối loạn tiêu chuẩn.
cuonglm

11

Sử dụng shopt -q :

shopt -q extglob && echo enable || echo disable

-qtùy chọn thực hiện shoptloại bỏ đầu ra và trả về trạng thái để chỉ ra rằng các tùy chọn được đặt hoặc bỏ đặt.

Lưu ý rằng shoptchỉ báo cáo các tùy chọn có thể xuất hiện trong BASHOPTSbiến, các tùy chọn đó không hợp lệ với setlệnh dựng sẵn.

Để kiểm tra các tùy chọn mà có giá trị đến set, hoặc có thể xuất hiện trong SHELLOPTS, sử dụng shopt -qo:

$ bash --posix -c 'shopt -qo posix && echo enable || echo disable'
enable

2
Tại sao không chỉ shopt extglob?
terdon

1
Bởi vì tôi không muốn đầu ra làm hỏng tiêu chuẩn của mình :)
cuonglm

Ý anh là gì? Theo như tôi có thể nói, OP muốn kiểm tra xem tùy chọn đã được đặt hay chưa. Họ đề cập rằng đây là một thiết bị đầu cuối, vì vậy tôi nghi ngờ đây là một phần của kịch bản. Và, dù sao, sự khác biệt là gì? Cả hai shopt extglobvà cách tiếp cận của bạn sẽ viết vào thiết bị xuất chuẩn. Bạn đang nghĩ đến shopt -q extglob && shopt -u extglob || shopt -s extglob?
terdon

@terdon: Chà, cách tiếp cận của tôi chỉ viết lên thiết bị xuất chuẩn nếu tôi muốn . Cách tiếp cận chung là shopt -q extglob && : Code when enable || : Code when disable.
cuonglm

3
Tôi có thể tưởng tượng việc viết một tập lệnh sẽ cố gắng duy trì cài đặt hiện có của người dùng, nhưng có thể có một đoạn mã quan trọng sẽ bị phá vỡ nếu nó không được đặt theo một cách cụ thể. Điều này cho thấy một phương pháp để âm thầm xác định trạng thái hiện tại, lưu nó và khôi phục nó càng sớm càng tốt sau khi thực hiện các hoạt động quan trọng đòi hỏi trạng thái có khả năng khác biệt.
Monty Harder

5

Có hai danh sách các tùy chọn trong bash. Một cho shoptvà một cho set.

Tùy chọn extglobthuộc về shoptdanh sách.
Giá trị của nó có thể được in bằng cách sử dụng shopt extglobhoặc shopt -p extglob.

Một tùy chọn như nounsetthuộc về setdanh sách.
Giá trị của nó có thể được in bằng cách sử dụng shopt -op nounsethoặc shopt -o nounset.

Kiểm tra một lựa chọn.

Để in một tùy chọn cụ thể (không thay đổi) cho shopt, hãy sử dụng shopt -p name:

$ shopt -p xpg_echo
shopt -u xpg_echo

Và cho set, sử dụng: shopt -po name(có, bạn có thể sử dụng shopt -opcho setdanh sách).

$  shopt -po xtrace
set +o xtrace

Danh sách tùy chọn.

Để liệt kê tất cả các tùy chọn từ shopt, sử dụng shopt(hoặc tái sử dụng shopt -p).
Ngoài ra shopt -shoặc shopt -ucó thể được sử dụng.

Cách để liệt kê tất cả các tùy chọn setlà với set -o(liên quan set +o:).
Hoặc: shopt -otương đương với set -oshopt -opset +o.

Hướng dẫn sử dụng

Từ LESS=+/'^ *shopt \[' man bash:

Không có tùy chọn hoặc với tùy chọn -p, một danh sách tất cả các tùy chọn có thể thiết lập được hiển thị, Nếu -s hoặc -u được sử dụng mà không có đối số optname, màn hình được giới hạn tương ứng với các tùy chọn được đặt hoặc bỏ đặt.

Từ LESS=+/'^ *set \[' man bash:

Nếu -o được cung cấp không có tên tùy chọn, các giá trị của các tùy chọn hiện tại sẽ được in. Nếu + o được cung cấp không có tên tùy chọn, một loạt các lệnh được đặt để tạo lại cài đặt tùy chọn hiện tại được hiển thị trên đầu ra tiêu chuẩn.

Ví dụ

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

$  shopt -sp
shopt -s checkwinsize
shopt -s cmdhist
shopt -s expand_aliases
shopt -s extglob
shopt -s extquote
shopt -s force_fignore
shopt -s histappend
shopt -s histverify
shopt -s interactive_comments
shopt -s progcomp
shopt -s promptvars
shopt -s sourcepath

Điều đáng nói là shopt -opcái nào thực sự liệt kê setcác tùy chọn:

$ shopt -op
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
set +o functrace
set -o hashall
set -o histexpand
set -o history
set +o ignoreeof
set -o interactive-comments
set +o keyword
set -o monitor
set +o noclobber
set +o noexec
set +o noglob
set +o nolog
set +o notify
set +o nounset
set +o onecmd
set +o physical
set +o pipefail
set +o posix
set +o privileged
set +o verbose
set +o vi
set +o xtrace
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.