เมื่อคุณดำเนินการset -a var=99
มีสามสิ่งที่แตกต่างเกิดขึ้น (เกี่ยวข้องกับคำถามของคุณ):
- ตัวเลือกชุด (
-a
) (ย้อนกลับโดยทำset +a
) เพื่อส่งออก vars
- พารามิเตอร์ตำแหน่งคือ "ตั้งค่า" เป็นสิ่งที่ตามหลังตัวเลือก (
$1
ตั้งค่าเป็นvar=99
)
- ตัวแปรเชลล์ขีดล่าง
$_
ถูกตั้งค่าเป็นพารามิเตอร์สุดท้าย (ขยาย)
ชุด
การดำเนินการของset -a
เครื่องหมายทั้งหมดที่ตามมา (ใหม่หรือมีการเปลี่ยนแปลง) เป็นตัวแปรที่ส่งออก (ในเปลือกหอยทั้งหมดยกเว้นcsh
และบางส่วนเปลือกหอยที่เกี่ยวข้อง)
$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer
หากต้องการกู้คืนจากการตั้งค่านี้เพียงแค่เปลี่ยน-
เป็น+
:
$ 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
set var = 99
ซึ่งจริงๆแล้วควรset -- var=99
หลีกเลี่ยงการตีความตัวเลือก (และชุดมีจำนวนมาก) ด้วยค่าที่ขึ้นต้นด้วยเส้นประ ( -
)
ชุดรายการของอาร์กิวเมนต์ (รายการพารามิเตอร์ตำแหน่ง) --
เพื่อว่าหลังจากที่ ที่ถูกต้องในเชลล์ที่สมเหตุสมผลทั้งหมด (ไม่ใช่ใน csh et al) อาร์กิวเมนต์ตำแหน่งจะพิมพ์ด้วย "$ @" (หรือคล้ายกัน "$ *" ไม่เท่ากับ)
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
_ = last_argument
และค่าของตัวแปรเชลล์ภายใน_
เปลี่ยนเป็นอาร์กิวเมนต์สุดท้ายของบรรทัดที่ดำเนินการ นั่นไม่เป็นความจริงในเชลล์เกือบทั้งหมด (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh และ csh และ tcsh) ยกเว้น 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
โปรดทราบว่าค่าใน$_
คือค่าหลังจากการขยาย:
$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument
$ echo "$_"
A New_Argument
นั่นเป็นเหตุผลที่เมื่อคุณรัน:
$ set -a myvar=99; set | grep 'myvar'
_=myvar=99
คุณจะได้รับคำอธิบายของตัวแปรเชลล์ '$ _' สิ่งนี้ยังใช้งานได้:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"