trừu tượng
Để đảo ngược set -x
chỉ cần thực hiện a set +x
. Hầu hết thời gian, đảo ngược của một chuỗi set -str
là cùng một chuỗi với +
: set +str
.
Nói chung, để khôi phục tất cả (đọc bên dưới về bash errexit
) các tùy chọn shell (đã thay đổi bằng set
lệnh) bạn có thể làm (cũng đọc bên dưới về shopt
các tùy chọn bash ):
oldstate="$(set +o); set -$-" # POSIXly store all set options.
.
.
set -vx; eval "$oldstate" # restore all options stored.
Mô tả dài hơn
bash
Lệnh này:
shopt -po xtrace
sẽ tạo ra một chuỗi thực thi phản ánh trạng thái của tùy chọn. Các p
phương tiện cờ in, và các o
quy định cụ thể cờ mà chúng ta đang hỏi về tùy chọn (s) thiết lập bởi các set
lệnh (như trái ngược với tùy chọn (s) thiết lập bởi các shopt
lệnh). Bạn có thể gán chuỗi này cho một biến và thực hiện biến ở cuối tập lệnh của bạn để khôi phục trạng thái ban đầu.
# store state of xtrace option.
tracestate="$(shopt -po xtrace)"
# change xtrace as needed
echo "some commands with xtrace as externally selected"
set -x
echo "some commands with xtrace set"
# restore the value of xtrace to its original value.
eval "$tracestate"
Giải pháp này hoạt động cho nhiều tùy chọn cùng một lúc:
oldstate="$(shopt -po xtrace noglob errexit)"
# change options as needed
set -x
set +x
set -f
set -e
set -x
# restore to recorded state:
set +vx; eval "$oldstate"
Thêm set +vx
tránh việc in một danh sách dài các tùy chọn.
Và, nếu bạn không liệt kê bất kỳ tên tùy chọn nào,
oldstate="$(shopt -po)"
nó cung cấp cho bạn các giá trị của tất cả các tùy chọn. Và, nếu bạn bỏ o
cờ, bạn có thể thực hiện những điều tương tự với shopt
các tùy chọn:
# store state of dotglob option.
dglobstate="$(shopt -p dotglob)"
# store state of all options.
oldstate="$(shopt -p)"
Nếu bạn cần kiểm tra xem một set
tùy chọn đã được đặt hay chưa, cách thành ngữ nhất (Bash) để thực hiện là:
[[ -o xtrace ]]
tốt hơn so với hai bài kiểm tra tương tự khác:
[[ $- =~ x ]]
[[ $- == *x* ]]
Với bất kỳ thử nghiệm nào, điều này hoạt động:
# record the state of the xtrace option in ts (tracestate):
[ -o xtrace ] && ts='set -x' || ts='set +x'
# change xtrace as needed
echo "some commands with xtrace as externally selected"
set -x
echo "some commands with xtrace set"
# set the xtrace option back to what it was.
eval "$ts"
Đây là cách kiểm tra trạng thái của một shopt
tùy chọn:
if shopt -q dotglob
then
# dotglob is set, so “echo .* *” would list the dot files twice.
echo *
else
# dotglob is not set. Warning: the below will list “.” and “..”.
echo .* *
fi
MỘT BỘ MÔ TẢ CHÍNH THỨC CUNG CẤP MỘT TIÊU CHUẨN CHO THIẾT KẾ HỆ ĐIỀU HÀNH, ĐẶC BIỆT LÀ CÁC MÔ TẢ TƯƠNG THÍCH VỚI UNIX
Một giải pháp đơn giản, tuân thủ POSIX để lưu trữ tất cả các set
tùy chọn là:
set +o
được mô tả trong tiêu chuẩn POSIX như:
+ o
Viết các cài đặt tùy chọn hiện tại vào đầu ra tiêu chuẩn ở định dạng phù hợp để tái tạo lại trình bao dưới dạng các lệnh đạt được các cài đặt tùy chọn tương tự.
Rất dễ:
oldstate=$(set +o)
sẽ bảo toàn các giá trị cho tất cả các tùy chọn được đặt bằng set
lệnh.
Một lần nữa, khôi phục các tùy chọn về giá trị ban đầu của chúng là vấn đề thực thi biến:
set +vx; eval "$oldstate"
Điều này chính xác tương đương với việc sử dụng Bash's shopt -po
. Lưu ý rằng nó sẽ không bao gồm tất cả các tùy chọn Bash có thể , vì một số tùy chọn được đặt bởi shopt
.
bash trường hợp đặc biệt
Có nhiều tùy chọn shell khác được liệt kê shopt
trong bash:
$ shopt
autocd off
cdable_vars off
cdspell off
checkhash off
checkjobs off
checkwinsize on
cmdhist on
compat31 off
compat32 off
compat40 off
compat41 off
compat42 off
compat43 off
complete_fullquote on
direxpand off
dirspell off
dotglob off
execfail off
expand_aliases on
extdebug off
extglob off
extquote on
failglob off
force_fignore on
globasciiranges off
globstar on
gnu_errfmt off
histappend on
histreedit off
histverify on
hostcomplete on
huponexit off
inherit_errexit off
interactive_comments on
lastpipe on
lithist off
login_shell off
mailwarn off
no_empty_cmd_completion off
nocaseglob off
nocasematch off
nullglob off
progcomp on
promptvars on
restricted_shell off
shift_verbose off
sourcepath on
xpg_echo off
Chúng có thể được thêm vào biến được đặt ở trên và được khôi phục theo cùng một cách:
$ oldstate="$oldstate;$(shopt -p)"
.
. # change options as needed.
.
$ eval "$oldstate"
Có thể làm (việc $-
được nối để đảm bảo errexit
được bảo tồn):
oldstate="$(shopt -po; shopt -p); set -$-"
set +vx; eval "$oldstate" # use to restore all options.
Lưu ý : mỗi shell có một cách hơi khác nhau để xây dựng danh sách các tùy chọn được đặt hoặc không đặt (không đề cập đến các tùy chọn khác nhau được xác định), do đó, các chuỗi không di động giữa các shell, nhưng hợp lệ cho cùng một shell.
trường hợp đặc biệt zsh
zsh
cũng hoạt động chính xác (theo POSIX) kể từ phiên bản 5.3. Trong các phiên bản trước, nó chỉ tuân theo POSIX một phần với set +o
nó in các tùy chọn ở định dạng phù hợp để tái tạo vỏ như các lệnh, nhưng chỉ cho các tùy chọn đã đặt (nó không in các tùy chọn chưa đặt ).
trường hợp đặc biệt mksh
Mksh (và do hậu quả lksh) chưa có (MIRBSD KSH R54 2016/11/11) có thể làm điều này. Hướng dẫn mksh có chứa điều này:
Trong phiên bản tương lai, set + o sẽ hành xử các lệnh in và tuân thủ POSIX để khôi phục các tùy chọn hiện tại thay thế.
trường hợp đặc biệt
Trong bash, giá trị của set -e
( errexit
) được đặt lại bên trong các vỏ con, điều này gây khó khăn cho việc nắm bắt giá trị của nó với set +o
bên trong một vỏ con $ ( Thay ).
Như một cách giải quyết, sử dụng:
oldstate="$(set +o); set -$-"