Khi bạn thực thi set -a var=99
, có ba điều khác biệt xảy ra (liên quan đến câu hỏi của bạn):
- Một tùy chọn thiết lập (
-a
) (đảo ngược bằng cách thực hiện set +a
) để xuất vars.
- Các tham số vị trí được "đặt" thành những gì theo sau các tùy chọn (
$1
được đặt thành var=99
).
- Dấu gạch dưới biến shell
$_
được đặt thành tham số cuối cùng (mở rộng).
đặt -a
Việc thực hiện set -a
đánh dấu tất cả các biến tiếp theo (mới hoặc thay đổi) là xuất (trong tất cả các shell, ngoại trừ csh
và một số shell liên quan).
$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer
Để khắc phục thiết lập này, chỉ cần thay đổi -
một +
:
$ set +a
$ unset myvariable # to erase it from the environment if it
# was exported before the change of set +a
$ myvariable=456544654 # A new value of the variable.
$ env | grep "variable" # No output means the var does not exist
# in the current environment
đặt var = 99
Điều này thực sự nên set -- var=99
tránh để giải thích một tùy chọn (và tập hợp có rất nhiều) với các giá trị bắt đầu bằng dấu gạch ngang ( -
).
Đặt danh sách các đối số (danh sách các tham số vị trí) thành sau đó --
. Điều đó là hợp lệ trong tất cả các shell hợp lý (không phải trong csh et al). Đối số vị trí được in bằng "$ @" (hoặc "$ *" tương tự, không bằng nhau).
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
_ = last_argument
Và, giá trị của biến shell bên trong _
thay đổi thành đối số cuối cùng của dòng được thực thi. Điều đó KHÔNG đúng trong hầu hết tất cả các shell (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh và tất nhiên là csh và tcsh) trừ bash.
$ echo one two last argument
one two last argument
$ echo "$_"
argument
$ echo This is a new: last_argument
This is a new: last_argument
$ echo "$_"
last_argument
Xin lưu ý rằng giá trị trong $_
là giá trị sau khi mở rộng:
$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument
$ echo "$_"
A New_Argument
Đó là lý do tại sao khi bạn thực thi:
$ set -a myvar=99; set | grep 'myvar'
_=myvar=99
Bạn nhận được một mô tả về biến shell '$ _'. Điều này cũng hoạt động:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"