ตัวแปรเชลล์
ตัวแปรเชลล์คือตัวแปรที่มีขอบเขตอยู่ในเซสชันเชลล์ปัจจุบันตัวอย่างเช่นในเซสชันเชลล์เชิงโต้ตอบหรือสคริปต์
คุณอาจสร้างตัวแปรเชลล์โดยการกำหนดค่าให้กับชื่อที่ไม่ได้ใช้:
var="hello"
การใช้ตัวแปรเชลล์คือการติดตามข้อมูลในเซสชันปัจจุบัน ตัวแปรเชลล์มักจะมีชื่อที่มีตัวอักษรพิมพ์เล็ก
ตัวแปรสภาพแวดล้อม
ตัวแปรสภาพแวดล้อมเป็นตัวแปรเชลล์ที่ถูกส่งออก ซึ่งหมายความว่าจะสามารถมองเห็นได้เป็นตัวแปรไม่เพียง แต่ในเซสชั่นเชลล์ที่สร้างมัน แต่ยังสำหรับกระบวนการใด ๆ (ไม่ใช่แค่เชลล์) ที่เริ่มต้นจากเซสชั่นนั้น
VAR="hello" # shell variable created
export VAR # variable now part of the environment
หรือ
export VAR="hello"
เมื่อตัวแปรเชลล์ได้รับการส่งออกแล้วมันจะยังคงถูกส่งออกจนกว่าจะไม่มีการตั้งค่าหรือจนกว่าจะมีการลบ "คุณสมบัติการส่งออก" (ด้วยexport -n
ในbash
) ดังนั้นจึงไม่จำเป็นต้องส่งออกอีกครั้ง การยกเลิกการตั้งค่าตัวแปรด้วยการunset
ลบมัน (ไม่ว่าจะเป็นตัวแปรสภาพแวดล้อมหรือไม่ก็ตาม)
อาร์เรย์และแฮชที่เชื่อมโยงในbash
และเชลล์อื่น ๆ อาจไม่สามารถส่งออกไปเป็นตัวแปรสภาพแวดล้อมได้ ตัวแปรสภาพแวดล้อมต้องเป็นตัวแปรอย่างง่ายที่มีค่าเป็นสตริงและมักจะมีชื่อที่ประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่
การใช้ตัวแปรสภาพแวดล้อมคือการติดตามข้อมูลในเซสชันเชลล์ปัจจุบัน แต่ยังอนุญาตให้กระบวนการเริ่มต้นใด ๆ ที่จะมีส่วนร่วมของข้อมูลนั้น กรณีทั่วไปของสิ่งนี้คือPATH
ตัวแปรสภาวะแวดล้อมซึ่งอาจถูกตั้งค่าในเชลล์และใช้ในภายหลังโดยโปรแกรมใด ๆ ที่ต้องการเริ่มโปรแกรมโดยไม่ระบุพา ธ แบบเต็ม
คอลเลกชันของตัวแปรสภาพแวดล้อมในกระบวนการมักเรียกว่า "สภาพแวดล้อมของกระบวนการ" แต่ละกระบวนการมีสภาพแวดล้อมของตัวเอง
ตัวแปรสภาพแวดล้อมสามารถเป็น "ส่งต่อ" เท่านั้นนั่นคือกระบวนการลูกไม่สามารถเปลี่ยนตัวแปรสภาพแวดล้อมในกระบวนการหลักของมันและอื่น ๆ นอกเหนือจากการตั้งค่าสภาพแวดล้อมสำหรับกระบวนการเด็กเมื่อเริ่มต้นกระบวนการผู้ปกครองอาจไม่เปลี่ยนสภาพแวดล้อมที่มีอยู่ของ กระบวนการลูก
ตัวแปรสภาพแวดล้อมอาจแสดงด้วยenv
(โดยไม่มีข้อโต้แย้งใด ๆ ) นอกเหนือจากนั้นมันจะเหมือนกับตัวแปรเชลล์ที่ไม่ได้ถูกเอ็กซ์พอร์ตในเชลล์เซสชัน นี่เป็นบิตพิเศษสำหรับเชลล์เนื่องจากภาษาการเขียนโปรแกรมส่วนใหญ่มักจะไม่ผสมตัวแปร "ธรรมดา" กับตัวแปรสภาพแวดล้อม (ดูด้านล่าง)
env
อาจใช้เพื่อตั้งค่าตัวแปรสภาพแวดล้อมหนึ่งหรือหลายตัวแปรในสภาพแวดล้อมของกระบวนการโดยไม่ต้องตั้งค่าในเซสชันปัจจุบัน:
env CC=clang CXX=clang++ make
เริ่มต้นนี้make
กับตัวแปรสภาพแวดล้อมCC
ตั้งค่าclang
และการตั้งค่าCXX
clang++
มันอาจถูกใช้เพื่อล้างสภาพแวดล้อมสำหรับกระบวนการ:
env -i bash
สิ่งนี้เริ่มต้นbash
แต่ไม่ถ่ายโอนสภาพแวดล้อมปัจจุบันไปยังbash
กระบวนการใหม่(มันจะยังคงมีตัวแปรสภาพแวดล้อมในขณะที่มันสร้างขึ้นใหม่จากสคริปต์การเริ่มต้นเชลล์)
ตัวอย่างของความแตกต่าง
$ var="hello" # create shell variable "var"
$ bash # start _new_ bash session
$ echo "$var" # no output
$ exit # back to original shell session
$ echo "$var" # "hello" is outputted
$ unset var # remove variable
$ export VAR="hello" # create environment variable "VAR"
$ bash
$ echo "$VAR" # "hello" is outputted since it's exported
$ exit # back to original shell session
$ unset VAR # remove variable
$ ( export VAR="hello"; echo "$VAR" ) # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR" # no output since a subshell has its own environment
ภาษาอื่น ๆ
มีฟังก์ชั่นห้องสมุดในภาษาการเขียนโปรแกรมส่วนใหญ่ที่ช่วยให้การรับและการตั้งค่าตัวแปรสภาพแวดล้อม โปรดทราบว่าเนื่องจากตัวแปรสภาพแวดล้อมถูกเก็บไว้เป็นความสัมพันธ์ของคีย์ - ค่าอย่างง่ายพวกเขาจึงไม่ได้เป็น "ตัวแปร" ของภาษา โปรแกรมอาจดึงค่า (ซึ่งมักจะเป็นสตริงอักขระ) ที่สอดคล้องกับคีย์ (ชื่อของตัวแปรสภาพแวดล้อม) แต่จากนั้นจะต้องแปลงเป็นจำนวนเต็มหรือชนิดข้อมูลใด ๆ ที่ภาษาต้องการให้มีค่า
ใน C, ตัวแปรสภาพแวดล้อมอาจจะเข้าถึงได้โดยใช้getenv()
, setenv()
, และputenv()
unsetenv()
ตัวแปรที่สร้างด้วยรูทีนเหล่านี้สืบทอดในวิธีเดียวกันโดยกระบวนการใด ๆ ที่โปรแกรม C เริ่มทำงาน
ภาษาอื่น ๆ ที่อาจจะมีโครงสร้างข้อมูลพิเศษสำหรับการบรรลุในสิ่งเดียวกันเช่น%ENV
กัญชาใน Perl หรืออาเรย์ในการใช้งานมากที่สุดของENVIRON
awk