โดยทั่วไปคุณสามารถใช้งานได้ทุกเมื่อที่คุณต้องการ "ฉีด" ตัวแปรสภาพแวดล้อมที่ส่งผ่านไปยังเชลล์สคริปต์ (เป็นอาร์กิวเมนต์) ราวกับว่าพวกเขาถูกตั้งค่าภายในสภาพแวดล้อมผ่านexport
แต่ไม่จำเป็นต้องให้พวกเขาอยู่ในexport
รายการอย่างถาวรก่อนที่จะเรียกใช้คำสั่ง .
หมายเหตุ:นอกจากนี้ยังมีแบบยาวของสวิทช์-k
set -o keyword
ตัวอย่าง
$ cat cmd1.bash
#!/bin/bash
echo $VARCMD
ตอนนี้ถ้าฉันset -k
:
$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi
แต่ถ้าฉันเพียงแค่เรียกใช้สคริปต์ข้างต้น:
$ ./cmd1.bash
$
การส่งออกกำลังทำอะไร
$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.
...
ดังนั้นถ้าเราจะเพิ่มexport | grep VAR
สคริปต์ของเราเช่น:
$ cat cmd2.bash
#!/bin/bash
echo $VARCMD
export | grep VAR
และเราก็ทำการทดสอบข้างต้นอีกครั้ง:
$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"
แต่ไม่มีset -k
:
$ ./cmd2.bash
$
ดังนั้นset -k
ช่วยให้เราสามารถส่งออกตัวแปรในมวลชั่วคราว
ตัวอย่างอื่น
$ cat cmd3.bash
#!/bin/bash
echo $VARCMD1
echo $VARCMD2
export | grep VAR
เมื่อเราตั้งค่าตัวแปรหลายตัวตัวแปรทั้งหมดจะถูกส่งออก:
$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"
ดังนั้นมันจึงเป็นแค่การฉีดตัวแปรสภาพแวดล้อมทั้งหมดหรือไม่
ไม่-k
ทำสิ่งที่ชัดเจนมากที่นี่ มันเป็นเพียงการส่งออกตัวแปรที่รวมอยู่ในบรรทัดคำสั่งเมื่อคำสั่งถูกดำเนินการ
ตัวอย่าง
พูดว่าฉันตั้งตัวแปรนี้:
$ VARCMD1="hi"
ตอนนี้เมื่อเราเรียกใช้คำสั่งเดียวกันถนัดVARCMD1="hi"
:
$ set -k; ./cmd3.bash VARCMD2="bye"; set +k
bye
declare -x VARCMD2="bye"
แต่ทำไมถึงเกิดขึ้น?
ฉันพบแหล่งข้อมูลนี้ซึ่งอธิบายเกี่ยวกับคุณลักษณะนี้เล็กน้อยชื่อ: "สตริงพารามิเตอร์การกำหนดคำหลัก" หมายเหตุ: URL ต้นทางใช้ที่อยู่ IP ดังนั้นฉันจึงไม่สามารถเชื่อมโยงไปยังที่นี่โดยตรงใน SE
http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html
เมื่อการเขียนโปรแกรมในภาษาใด ๆ ตัวแปรและค่าของการส่งผ่านเป็นสิ่งสำคัญสำหรับการเขียนรหัสที่เชื่อถือได้ ข้างชนิดตัวแปรจำนวนเต็มและอาร์เรย์ตัวแปรเชลล์อื่นทั้งหมดยอมรับสตริงเป็นค่า เมื่อพูดถึงภาษาการเขียนโปรแกรมเชลล์เพื่อให้สอดคล้องกันเราต้องการวลี "พารามิเตอร์คำหลัก" ต่อไปนี้เป็นข้อควรระวังเมื่อกำหนดค่าให้กับพารามิเตอร์คำหลัก:
เพื่อหลีกเลี่ยงผลกระทบที่ไม่คาดคิดให้วางสตริงย่อยการกำหนดพารามิเตอร์ไว้ด้านหน้าของสตริงคำสั่งเสมอ
ในเชลล์ B ค่าที่กำหนดของพารามิเตอร์คำหลักจะถูกเก็บไว้ในตัวแปรเชลล์ (โลคัล) ใน bash และ ksh สตริงการกำหนดพารามิเตอร์คีย์เวิร์ดคำสั่งก่อนหน้าจะไม่ถูกเก็บไว้ในตัวแปรเชลล์ สิ่งเหล่านี้มีผลกับการประมวลผลย่อยทางแยกทันทีเพื่อดำเนินการคำสั่งปัจจุบัน บรรทัดของสตริงคำหลักที่ได้รับมอบหมายเพียงอย่างเดียวจะได้รับการจัดเก็บไว้ในตัวแปรเชลล์ (โลคัล) สตริงการกำหนดพารามิเตอร์คำสำคัญอาจปรากฏขึ้นเป็นอาร์กิวเมนต์ไปยังคำสั่ง alias, ประกาศ, ประเภท, ส่งออก, อ่านได้อย่างเดียวและคำสั่ง builtin ท้องถิ่น [ส่วน 3.4 ของคู่มืออ้างอิง Bash]
สตริงการกำหนดพารามิเตอร์คีย์เวิร์ดจะถูกใช้เป็นอาร์กิวเมนต์สำหรับคำสั่งที่จะดำเนินการหากวางไว้หลังชื่อคำสั่ง
- พารามิเตอร์คีย์เวิร์ดอาจถูกจัดการโดยคำสั่ง set
-k
อนุญาตให้เราเรียกใช้เชลล์สคริปต์อายุ 30 ปีโดยไม่จำเป็นต้องปรับโครงสร้างใหม่ ส่งผ่านตัวแปรสภาพแวดล้อมชั่วคราวโดยใช้ไวยากรณ์คำนำหน้าแทน:var1=x var2=y command ...