ความหมายของคำพูดเดี่ยวและคู่ในตัวแปรสภาพแวดล้อมคืออะไร?


19

ฉันกำหนดตัวแปรสภาพแวดล้อมบางอย่างใน. profile ของฉันเช่นนี้:

MY_HOME="/home/my_user"

แต่ดูเหมือนว่าตัวแปรจะไม่ประเมินเว้นแต่ว่าฉันจะตัดเครื่องหมายคำพูดออกแล้วทำการซอร์สไฟล์อีกครั้ง ฉันเชื่อว่าจำเป็นต้องมีเครื่องหมายอัญประกาศหากจะมีช่องว่างและใช้เครื่องหมายอัญประกาศเดี่ยวหากไม่ต้องการ Escape บางคนสามารถอธิบายความสำคัญของคำพูดเดี่ยวและคู่ในคำจำกัดความของตัวแปรได้หรือไม่? เห็บหน้าและเห็บหลังเหรอ?

คำตอบ:


23

ฉันคิดว่าคุณสับสนเกี่ยวกับคำศัพท์

"ตัวแปรสภาพแวดล้อม" เป็นเพียงตัวแปรเชลล์ที่กระบวนการลูกใด ๆ จะสืบทอด

สิ่งที่คุณทำในตัวอย่างของคุณคือการสร้างตัวแปรเชลล์ มันไม่ได้อยู่ในสภาพแวดล้อมจนกว่าคุณจะส่งออก:

MY_HOME="/home/my_user"
export MY_HOME

วางตัวแปรชื่อ "MY_HOME" ในเชลล์เกือบทั้งหมด (csh, tcsh ยกเว้น)

ในกรณีนี้เครื่องหมายคำพูดคู่จะฟุ่มเฟือย พวกเขาไม่มีผลกระทบ กลุ่มย่อยอัญประกาศคู่ แต่อนุญาตให้เปลือกใด ๆ ที่คุณใช้เพื่อทำการทดแทนตัวแปร การอ้างถึงกลุ่มย่อยแบบเดี่ยวและป้องกันการทดแทน เนื่องจากการกำหนดตัวอย่างของคุณไม่มีตัวแปรใด ๆ ในนั้นเครื่องหมายคำพูดคู่อาจปรากฏเป็นเครื่องหมายคำพูดเดี่ยว

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

ไม่มีสิ่งใดในสภาพแวดล้อมจนกว่าคุณจะส่งออก


18

ตัวแปร Shell เทียบกับตัวแปรสภาพแวดล้อม

MY_HOME="/home/my_user"กำหนดตัวแปรเปลือกMY_HOMEที่เรียกว่า เชลล์เป็นภาษาโปรแกรมและมีตัวแปร (เรียกอีกอย่างว่าพารามิเตอร์) echo "$MY_HOME"หลังจากที่ได้รับมอบหมายนี้คุณสามารถใช้ค่าของตัวแปรเช่นกับ

ตัวแปรของเชลล์เป็นแนวคิดของเชลล์ภายใน เมื่อเชลล์อินสแตนซ์นั้นสิ้นสุดลงMY_HOMEจะถูกลืม สิ่งที่ทุกโปรแกรมรู้เกี่ยวกับและส่งให้กับเด็กที่เป็นตัวแปรสภาพแวดล้อม

ภายในเชลล์ตัวแปรสภาพแวดล้อมและตัวแปรเชลล์ทำงานในลักษณะที่คล้ายกันมาก สิ่งที่เกิดขึ้นจริงคือตัวแปรสภาพแวดล้อมทั้งหมดที่เชลล์สืบทอดจากพาเรนต์กลายเป็นตัวแปรเชลล์ ตรงกันข้ามตัวแปรเปลือกที่กำหนดไว้ในสคริปต์เปลือกจะกลายเป็นตัวแปรสภาพแวดล้อมถ้าคุณส่งออกมัน

export MY_HOME="/home/my_user"

รายละเอียดเพิ่มเติมที่คุณสามารถข้ามไปอ่านครั้งแรก

เหตุผลที่ตัวแปรเชลล์ไม่ได้กลายเป็นตัวแปรสภาพแวดล้อมโดยอัตโนมัติเป็นส่วนหนึ่งที่สคริปต์อาจใช้ชื่อตัวแปรที่มีความหมายกับโปรแกรมที่เปิดตัวโดยไม่ได้ตั้งใจ

เชลล์เก่ามากบางอันจำเป็นต้องexportใช้ทุกครั้งที่คุณเปลี่ยนชื่อตัวแปร แต่เชลล์สมัยใหม่ทั้งหมดติดตามการกำหนดค่าสำหรับตัวแปรสภาพแวดล้อมเพื่อให้สนิปเพตดังต่อไปนี้สะท้อนbar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

นอกจากนี้บางหอยเก่ามากจำเป็นต้องใช้คำสั่งที่แยกต่างหากสำหรับmyvar=fooและแต่ทั้งหมดเปลือกหอยที่ทันสมัยเข้าใจexport myvarexport myvar=foo

คุณสามารถรันset -aเพื่อทำการมอบหมายตัวแปรเชลล์ทั้งหมดโดยอัตโนมัติเอ็กซ์พอร์ตตัวแปรดังนั้นนั่นmyvar=fooเท่ากับexport myvar=fooถ้าคุณรันset -aในเชลล์นั้นก่อน

เมื่อพูดถึง

การอ้างอิงส่วนใหญ่จะเป็นมุมฉาก หากค่าที่คุณกำหนดให้กับตัวแปรไม่มีอักขระใด ๆ ที่พิเศษสำหรับเชลล์คุณไม่จำเป็นต้องใส่เครื่องหมายอัญประกาศ หากมีอักขระพิเศษคุณต้องป้องกันด้วยเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่หรือแบ็กสแลชหรือการรวมกัน สิ่งนี้จะเกิดขึ้นกับทั้งmyvar=valueไวยากรณ์ธรรมดาและexportยูทิลิตี้

มีความแตกต่างอย่างหนึ่งระหว่างไวยากรณ์การมอบหมายและexportไวยากรณ์ เชลล์จะขยายผลลัพธ์ของการแทนที่ตัวแปร$fooเพิ่มเติมโดยดำเนินการแยกฟิลด์ (คำ)และการขยายชื่อพา ธ (การวนซ้ำ) ซึ่งหมายความว่าหากค่าของmyvarคือhello ​ *ให้echo $myvarพิมพ์helloตามด้วยช่องว่างเดียวตามด้วยรายการไฟล์ในไดเรกทอรีปัจจุบัน นี้เกือบจะไม่เป็นที่น่าพอใจจึงหลักการทั่วไปมักจะใช้คำพูดสองรอบแทนตัวแปร (ยกเว้นกรณีที่คุณรู้ว่าคุณจำเป็นต้องพา ธ echo "$myvar"การขยายตัวหรือแยกเขต): ในกรณีของการมอบหมายอย่างง่ายothervar=$myvarในความเป็นจริงเชื่อถือได้คัดลอกค่าของmyvarถึงothervarเนื่องจาก globbing และการแบ่งคำถูกยับยั้งในการมอบหมาย (เพราะพวกเขาสร้างหลายคำ แต่คาดว่าจะมีคำเดียว) การยกเว้นนี้ไม่ได้นำไปใช้exportอย่างไร ดังนั้นหากคุณต้องการจดจำกฎง่ายๆให้ใช้เครื่องหมายคำพูดคู่ล้อมรอบการแทนที่ตัวแปรเสมอ


คุณช่วยอธิบายหน่อยได้ไหมว่า ในส่วน "ในการอ้างอิง"? ฉันไม่เข้าใจความหมายของมุมฉากในประโยคนั้น
ความยุติธรรมสำหรับโมนิก้า

1
@DKBose นั่นหมายความว่า environment vs shell variables ในอีกด้านหนึ่งและการอ้างอิงในทางกลับกันนั้นเป็นสองประเด็นที่แยกจากกันซึ่งมีส่วนเกี่ยวข้องน้อยมาก ความหมายของWiktionary 4 และ 5
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.