Làm cách nào tôi có thể liệt kê các tùy chọn bash cho shell hiện tại?


27

Bản thân bash intepreter có các tùy chọn, nghĩa là

Dòng 22-23 của trang man của bash:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

Tôi đã sử dụng một vài mẫu tìm kiếm trong trang bash man như:

  • /^\s*set
  • /list

Có thể in danh sách các cài đặt này được áp dụng cho trình bao hiện tại không?

Câu trả lời:


26
printf %s\\n "$-"

Sẽ liệt kê các tùy chọn chữ cái duy nhất trong một chuỗi.

Tham số đó cũng có thể được sử dụng như:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

Trước tiên, để tắt -fmở rộng ilename shell trong khi đồng thời lưu một giá trị cho $-- nếu có - trong $1. Tiếp theo, không có hiện +ftượng ảm đạm nào xảy ra và lần mở rộng ilename cuối cùng được kích hoạt một lần nữa và có thể cũng bị vô hiệu hóa.

Ví dụ: nếu -fmở rộng ilename đã bị vô hiệu hóa khi giá trị cho $-lần đầu tiên được lưu, thì giá trị được lưu của nó sẽ là (ít nhất) :

f

Và khi setđược chạy lại, nó hoạt động để:

set +f -f

Mà chỉ đưa bạn trở lại nơi bạn bắt đầu.

set +o

Sẽ liệt kê tất cả các settùy chọn vỏ bảng (xem câu trả lời của Jason cho shoptkhả năng - đó có phải là một từ không? - tùy chọn) ở dạng an toàn cho việc thử lại vỏ. Theo cách đó, bạn cũng có thể làm:

state=$(set +o)
set -some -crazy -options
eval "$state"

Để lưu, thay đổi và khôi phục trạng thái của tùy chọn shell tương ứng.

Để xử lý shoptcác settùy chọn ion và bảng trong một lần:

state=$(set +o;shopt)
#do what you want with options here
eval "$state"

Bạn cũng có thể gọi set mà không có bất kỳ đối số nào để thêm danh sách tất cả các biến được đặt hiện tại của shell - cũng được trích dẫn để nhập lại vào shell. Và bạn có thể - trong bash - thêm lệnh typeset -fpđể bao gồm tất cả các hàm shell hiện được khai báo. Bạn có thể gộp tất cả lại với nhau và evalkhi sẵn sàng. Bạn thậm chí có thể gọi aliasmà không cần đối số cho nhiều hơn cùng. Điều đó ... có thể bao gồm nó, mặc dù. Tôi đoán là có "$@"- mà bạn phải đặt vào một bashmảng trước, tôi cho rằng, trước khi làm set.

Không, cũng có trap. Điều này một chút buồn cười. Thông thường:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

... sẽ chỉ in đây là subshell của tôi bởi vì subshell là một tiến trình mới và có tập hợp traps của riêng nó - và do đó không thừa kế bất kỳ traps nào ngoài những cái mà cha mẹ của nó đã bỏ qua rõ ràng - (như trap '' INT) .

Tuy nhiên:

trap 'echo this is my trap' 0
save_traps=$(trap)

traphành xử đặc biệt khi nó là lệnh đầu tiên và duy nhất chạy trong một lớp con thay thế lệnh trong đó nó sẽ sao chép một danh sách các shell cha hiện đang được đặt trapsở định dạng được trích dẫn để thử lại an toàn cho shell. Và vì vậy, bạn có thể thực hiện save_traps, sau đó set không cần đối số - và tất cả phần còn lại đã được đề cập - để có được một khóa trên tất cả trạng thái shell. Tuy nhiên, bạn có thể muốn thêm export -preadonly -pkhôi phục các thuộc tính var shell gốc.

Dù sao, thế là đủ.


cảm ơn, mã của bạn hoạt động độc đáo Vì vậy, để có được một danh sách đầy đủ của tất cả các tùy chọn, bạn sẽ phải sử dụng cả hai set +o shopt ? (như shoptcó thể là một từ, settableđược sử dụng trong trang man, vì vậy nó shoptablehoạt động với tôi)
the_velour_fog

@ user4668401 - Tôi nghĩ rằng sẽ làm điều đó.
mikeerv

TL; DR, nhưng +1000 cho giải pháp 3 dòng để thay đổi một tùy chọn và đặt lại 'như cũ'. Đó chính xác là những gì người ta cần khi tạo tập lệnh hoặc hướng dẫn sao chép / dán.
Balmipour

@mikeerv Có vẻ như tùy chọn -p cần được thêm khi lưu trạng thái để bao gồm shoptcác ion, tức làstate=$(set +o;shopt -p)
nkatsar

9

Từ mantrang:

shopt
... 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ị, với một dấu hiệu cho biết mỗi tùy chọn có được đặt hay không.
shopt | grep on

sẽ in một danh sách tất cả các tùy chọn được kích hoạt.


đã làm việc, cảm ơn. Bạn có biết nếu điều này liệt kê các tùy chọn có thể giải quyết được bởi cả hai setshopt?
the_velour_fog

@ user4668401 Không, setrộng hơn nhiều: xem mục nhập trang man .
jasonwryan

Và để kiểm tra nếu một tùy chọn duy nhất được bật:shopt <option>
kos

điều này sẽ bao gồm các opts với 'on' trong tên (nghĩa là huponexit). Cách khắc phục đơn giản làshopt | grep on$
Mike D

6

Để liệt kê tất cả các tùy chọn:

set -o

Để kiểm tra một lựa chọn cụ thể:

set -o | grep <OPTION>

Lấy tùy chọn verboselàm ví dụ:

$ set -o | grep verbose
verbose         off

6

Tùy chọn?: Có ba nhóm tùy chọn trong bash.

  1. Các tùy chọn đọc hoặc thiết lập bởi lệnh set.
    (sử dụng lệnh này cho hướng dẫn sử dụng LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash:)
    Tất cả các tùy chọn một chữ cái:abefhkmnptuvxBCEHPT

    Ngoài ra các tùy chọn (không có chữ cái tương đương):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Các tùy chọn đọc hoặc thiết lập bởi lệnh shopt.
    (đọc hướng dẫn bằng lệnh này LESS=+/'shopt \[-pqsu\]' man bash':)
    Danh sách khá dài nhưng dễ in, sử dụng:

    $ shopt -p

    hoặc tương tự (nhưng không bằng nhau):

    $ shopt
  3. Các tùy chọn có thể được đặt trên HÓA ĐƠN:
    (lệnh cho hướng dẫn sử dụng LESS=+/'^INVOCATION' man bash:)

    Tất cả các settùy chọn:

    bash -abefhkmnptuvxBCEHPT

    Tất cả các shopttùy chọn

    bash -O option

    Một số tùy chọn chỉ có ý nghĩa khi HÓA ĐƠN:

    bash -lirsDc

    Và, cũng (tùy chọn dài):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version

Tất cả các settùy chọn một chữ cái và -riđược in bằng $-.

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

Ví dụ:

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

Gọi bash như một vỏ đăng nhập chỉ được báo cáo với shopt:

-l      Login
read with `shopt -p login_shell`

Như vậy:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

Tùy chọn -nkhông thể được kiểm tra bởi bất kỳ mã nào, vì nó có nghĩa là: không thực thi bất kỳ mã nào.


Tùy chọn in

Công cụ tốt nhất để liệt kê các tùy chọn của shell đang chạy , cả những cái được đặt với sethoặc cái được đặt cùng shoptlà giống nhau shopt. Để liệt kê các tùy chọn thiết lập:

shopt -o

Mà hoạt động chính xác như set -o. Sử dụng shopt -pođể có được kết quả tương tự như set +o.

Để liệt kê các tùy chọn shopt:

shopt -p

Trong đó bạn có thể chọn in shopt -pshoặc đặtshopt -pu

Để có được tất cả các tùy chọn. Càng nhiều càng tốt, nhiều tùy chọn dài và một số ( -sDc) trên HÓA ĐƠN không thể được in:

$ echo $-; shopt -p ; shopt -po

Để lưu trữ chúng trong một biến:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

Và biến có thể được sử dụng để đặt lại tất cả các tùy chọn:

$ eval "$storeoptions"

1

Để kiểm tra một lựa chọn cụ thể:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
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.