Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

ตัวแปรสภาพแวดล้อมใน Bash คืออะไร?

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

ในคอมพิวเตอร์ ตัวแปรจะถูกใช้ในลักษณะเดียวกัน

ตัวอย่างเช่น บุคคลใดก็ตามที่มีบัญชีผู้ใช้บนคอมพิวเตอร์จะมีไดเร็กทอรีหลักที่คอมพิวเตอร์เก็บข้อมูลส่วนบุคคลไว้ แต่ผู้ใช้แต่ละคนมีโฮมไดเร็กทอรีที่แตกต่างกัน (/home/seth สำหรับเซธ /home/tux สำหรับ Tux และอื่นๆ สำหรับผู้ใช้แต่ละราย) ดังนั้นเมื่อคุณต้องการอ้างอิงถึงโฮมไดเร็กตอรี่ทั่วไป คุณสามารถใช้ตัวแปร $HOME เพื่อระบุโฮมไดเร็กตอรี่ของ ปัจจุบัน ผู้ใช้โดยไม่คำนึงถึงชื่อล็อกอินของผู้ใช้

ตัวแปรสภาพแวดล้อมเป็นตัวแปรพิเศษ (เช่น $HOME ) ที่มีข้อมูลเกี่ยวกับเซสชันการเข้าสู่ระบบของคุณ มันถูกเก็บไว้สำหรับเชลล์ระบบเพื่อใช้เมื่อดำเนินการคำสั่ง มีอยู่ไม่ว่าคุณจะใช้ Linux, Mac หรือ Windows ตัวแปรเหล่านี้จำนวนมากถูกกำหนดโดยค่าเริ่มต้นระหว่างการติดตั้งหรือการสร้างผู้ใช้

แม้ว่าตัวแปรสภาพแวดล้อมจะมีผลกับระบบสมัยใหม่ทั้งหมด บทความนี้กล่าวถึงตัวแปรสภาพแวดล้อมใน Bash shell บน Linux, BSD, Mac และ Cygwin โดยเฉพาะ

ทำความเข้าใจกับตัวแปรสภาพแวดล้อม

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

คุณมักไม่ได้ใช้ตัวแปรสภาพแวดล้อมโดยตรง มีการอ้างอิงโดยแต่ละแอปพลิเคชันและภูตตามต้องการ ตัวอย่างเช่น โฮมไดเร็กทอรีของคุณถูกตั้งค่าเป็นตัวแปรสภาพแวดล้อมเมื่อคุณเข้าสู่ระบบ ตัวอย่างเช่น บน Linux คุณสามารถดู HOME ของคุณ เนื้อหาของตัวแปรสภาพแวดล้อมเช่นนี้:

$ echo $HOME
HOME=/home/seth

บน Mac:

$ echo $HOME
HOME=/Users/bogus

บน Windows:

C:\Users\bogus

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

$ env | more
TERM=xterm-256color
LESSOPEN=||/usr/bin/lesspipe.sh %s
USER=seth
SUDO_EDITOR=emacs
WWW_HOME=https://mirror.lagoon.nc/pub/slackware/slackware64-current/ChangeLog.txt
VISUAL=emacs
DISPLAY=:0
PS1=$
XDG_DATA_DIRS=/home/seth/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
GDMSESSION=gnome
MAIL=/var/spool/mail/seth
[...]

ตัวแปรสภาพแวดล้อมมีประโยชน์เมื่อคุณต้องการแทนที่การตั้งค่าเริ่มต้น หรือเมื่อคุณต้องการจัดการการตั้งค่าใหม่ที่ระบบของคุณไม่มีเหตุผลที่จะสร้างด้วยตัวเอง ตัวอย่างเช่น เมื่อคุณพิมพ์คำสั่ง เหตุผลเดียวที่คอมพิวเตอร์ของคุณรู้วิธีค้นหา แอปพลิเคชันที่สอดคล้องกับคำสั่งนั้นคือ PATH ตัวแปรสภาพแวดล้อมบอกว่าจะดูที่ไหน ตัวแปรนี้แสดงรายการไดเรกทอรีที่ถูกต้องสำหรับระบบปฏิบัติการของคุณเพื่อค้นหาคำสั่ง ไม่ว่าคำสั่งนั้นจะเป็น ls หรือ cp หรือแอปพลิเคชันกราฟิก เช่น Firefox หรือ Lutris หรืออย่างอื่น

ตัวแปรสภาพแวดล้อมที่แตกต่างกันถูกใช้โดยระบบที่แตกต่างกัน เส้นทางของคุณ ตัวแปรมีความสำคัญต่อเทอร์มินัลอีมูเลเตอร์ของคุณ ตัวอย่างเช่น Java มีความสำคัญน้อยกว่ามาก (ซึ่งมีเส้นทางของตัวเอง ซึ่งชี้ไปยังไลบรารี Java ที่สำคัญ) อย่างไรก็ตาม USER ตัวแปรถูกใช้โดยหลายระบบเพื่อระบุว่าใครกำลังร้องขอบริการ ตัวอย่างเช่น หากคุณใช้ระบบที่มีผู้ใช้หลายคนและจำเป็นต้องตรวจสอบกล่องจดหมายในเครื่อง คำสั่ง mail ของคุณจะรู้ว่าจะดึงสปูลของอีเมลใดตาม MAIL และ USER ตัวแปร

การตั้งค่าตัวแปรสภาพแวดล้อม

โดยปกติโปรแกรมติดตั้งไม่ว่าจะเป็น dnf บน Fedora ฉลาด บน Ubuntu ชง บน Mac หรือโปรแกรมติดตั้งแบบกำหนดเอง จะอัปเดตตัวแปรสภาพแวดล้อมของคุณสำหรับแอปพลิเคชันใหม่ แม้ว่าบางครั้งเมื่อคุณกำลังติดตั้งบางสิ่งที่อยู่นอกเหนือชุดเครื่องมือที่ตั้งใจไว้สำหรับการแจกจ่ายของคุณ คุณอาจต้องจัดการตัวแปรสภาพแวดล้อมด้วยตัวเอง หรือคุณอาจเลือกที่จะเพิ่มตัวแปรสภาพแวดล้อมเพื่อให้เหมาะกับความต้องการของคุณ หากคุณตัดสินใจว่าต้องการเก็บบางแอปพลิเคชันไว้ใน ถัง โฟลเดอร์ที่อยู่ในโฮมไดเร็กตอรี่ของคุณ จากนั้นคุณต้องเพิ่มไดเร็กทอรีนั้นใน PATH . ของคุณ เพื่อให้ระบบปฏิบัติการของคุณรู้ว่าต้องมองหาแอปพลิเคชันที่จะเรียกใช้เมื่อคุณออกคำสั่ง

ตัวแปรสภาพแวดล้อมชั่วคราว

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

$ export PATH=$PATH:/home/seth/bin

ยืนยันผลลัพธ์:

$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin

ปิดเซสชั่น:

$ exit

เปิดใหม่และดูที่ เส้นทาง ตัวแปร:

$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin

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

ตัวแปรสภาพแวดล้อมถาวร

คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมแบบถาวรของคุณเองในไฟล์การกำหนดค่าเชลล์ของคุณ ซึ่งโดยทั่วไปคือ ~/.bashrc . หากคุณเป็นผู้ดูแลระบบที่จัดการผู้ใช้หลายราย คุณยังสามารถตั้งค่าตัวแปรสภาพแวดล้อมในสคริปต์ที่อยู่ใน /etc/profile.d ไดเรกทอรี

ไวยากรณ์สำหรับการตั้งค่าตัวแปรตามไฟล์การกำหนดค่าจะเหมือนกับการตั้งค่าตัวแปรในเชลล์ของคุณ:

export PATH=$PATH:/snap/bin:/home/seth/bin

ปิดเชลล์ปัจจุบัน มิฉะนั้น บังคับให้โหลดการกำหนดค่าที่อัปเดต:

$ . ~/.bashrc

สุดท้าย ให้ดูเส้นทางของระบบอีกครั้ง:

$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin

ขณะนี้มีการตั้งค่าอย่างถูกต้องเพื่อรวมไดเร็กทอรีที่กำหนดเองเพิ่มเติมของคุณ

การค้นหาตัวแปรสภาพแวดล้อมอื่นๆ

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

คำตอบอยู่ในเอกสารประกอบการสมัคร ตัวอย่างเช่น หากต้องการค้นหาว่ามีตัวเลือกใดบ้างสำหรับสภาพแวดล้อม Bash ทั่วไป คุณสามารถอ่านเอกสารประกอบของ Bash ในขณะที่หน้า man ของ Bash กล่าวถึงตัวแปรที่สำคัญมากมาย หน้าข้อมูล GNU สำหรับ Bash ก็มีรายการตัวแปรสภาพแวดล้อม Bourne Shell และ Bash ที่มีประโยชน์สองรายการอย่างละเอียดถี่ถ้วน และวิธีการใช้แต่ละตัวแปร

ตัวอย่างเช่น ในรายการหน้าข้อมูล:

'HISTCONTROL'
     A colon-separated list of values controlling how commands are saved
     on the history list.  If the list of values includes 'ignorespace',
     lines which begin with a space character are not saved in the
     history list.  A value of 'ignoredups' causes lines which match the
     previous history entry to not be saved.  A value of 'ignoreboth' is
     shorthand for 'ignorespace' and 'ignoredups'.
     [...]

ผลลัพธ์นี้บอกคุณว่า HISTCONTROL ตัวแปรสภาพแวดล้อมจะควบคุมวิธีการนำเสนอประวัติ Bash ของคุณและค่าใดที่คุณสามารถใช้ปรับแต่งประสบการณ์นั้นได้ ในตัวอย่างนี้ ละเว้น ค่าบอกผลลัพธ์ของ ประวัติ คำสั่งละเว้นบรรทัดที่ซ้ำกัน

คุณสามารถทดสอบสิ่งนี้ได้อย่างง่ายดาย ขั้นแรก ออกคำสั่งเดียวกันสองครั้งติดต่อกัน:

$ echo "hello world"
hello world
$ echo "hello world"
hello world

ดูประวัติของคุณหรืออย่างน้อยรายการล่าสุด:

$ history | tail -5
 996  man bash
 997  info bash
 998  echo "hello world"
 999  echo "hello world"
 1000 history

คุณจะเห็นได้ว่ารายการที่ซ้ำกันมีอยู่จริงในขณะนี้

ตั้งค่าตัวแปรสภาพแวดล้อมใหม่ใน .bashrc . ของคุณ ตามสิ่งที่คุณอ่านในหน้าข้อมูล:

export HISTCONTROL=$HISTCONTROL:ignorespace:ignoredups

บันทึกแล้วโหลดการกำหนดค่าใหม่ของคุณ:

$ source ~/.bashrc

ออกคำสั่งสองครั้งติดต่อกัน:

$ echo "hello once"
hello once
$ echo "hello once"
hello once

ดูรายการล่าสุดในประวัติของคุณ:

$ history | tail -5
 1000 history
 1001 emacs ~/.bashrc
 1002 source ~/.bashrc
 1003 echo "hello once"
 1004 history

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

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