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 -f
mở 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 +f
tượ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 -f
mở 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 set
tùy chọn vỏ bảng (xem câu trả lời của Jason cho shopt
khả 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ý shopt
các set
tù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à eval
khi sẵn sàng. Bạn thậm chí có thể gọi alias
mà 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 bash
mả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 trap
s của riêng nó - và do đó không thừa kế bất kỳ trap
s 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)
trap
hà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 -p
và readonly -p
khôi phục các thuộc tính var shell gốc.
Dù sao, thế là đủ.
set +o
vàshopt
? (nhưshopt
có thể là một từ,settable
được sử dụng trong trang man, vì vậy nóshoptable
hoạt động với tôi)