ในคอมพิวติ้ง Variable คือ คำที่แทนค่าที่เปลี่ยนแปลงได้ คุณใช้ Variables ทุกวันในภาษาพูดปกติ แต่อาจไม่คิดว่ามันคือ Variables ตอนพูด "รถของฉัน" คุณใช้ "รถของฉัน" แทน Variable อ้างอิงรถที่คุณครองขณะนั้น Make และ Model แน่ใจเปลี่ยนตลอดชีวิตเมื่อเปลี่ยนรถเก่าเป็นรถใหม่ แต่โดยสร้าง Variable "รถของฉัน" ไม่ต้องบ่นทุกครั้งว่ารถแบบไหนตอนอ้างอิงรถของคุณ
บนคอมพิวเตอร์ Variables ใช้ในลักษณะเดียวกัน
เช่น ทุกคนที่มี User Account บน Computer มี Home Directory ที่ Computer เก็บ Personal Data แต่แต่ละ User มี Home Directory แยกกัน (/home/seth สำหรับ Seth, /home/tux สำหรับ Tux, ต่อไปทุก User) ดังนั้นตอนอ้างอิง Home Directory แบบ Generic สามารถใช้ Variable $HOME บ่งบอก Home Directory ของ Current User ไม่ว่าจะ Login Name อะไร
Environment Variables คือ Special Variables (อย่าง $HOME) ที่มีข้อมูล Login Session เก็บไว้ให้ System Shell ใช้ตอน Execute Commands มีอยู่ไม่ว่าจะ Linux, Mac, Windows หลายตัว Set By Default ระหว่าง Installation หรือ User Creation
แม้ Environment Variables ใช้ได้ทุก Modern Systems บทความนี้ Environment Variables ใน Bash Shell บน Linux, BSD, Mac, Cygwin
เข้าใจ Environment Variables
Environment Variables ไม่ต่างจาก Variables ด้าน Technical Set, Recall, Clear ได้ด้วย Syntax เหมือน Variables หากไม่คุ้นเคย Variables ใน Bash อ่านบทความ Variables ใน Bash ก่อนต่อ
ไม่ค่อยใช้ Environment Variables โดยตรง ถูก Reference โดย Applications และ Daemons ตามต้องการ เช่น Home Directory Set เป็น Environment Variable ตอน Login ตัวอย่าง Linux ดู HOME Environment Variable:
$ echo $HOME
HOME=/home/seth
บน Mac:
$ echo $HOME
HOME=/Users/bogus
บน Windows:
C:\Users\bogus
ดู Environment Variables ทั้งหมดบน System ด้วย Command env List ยาว Pipe ผ่าน more อ่านง่าย:
$ 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
[...]
Environment Variables มีประโยชน์ตอน Override Default Settings หรือจัดการ Settings ใหม่ที่ System ไม่มีเหตุผลสร้างเอง เช่น ตอนพิมพ์ Command Computer รู้หา Application ตรงกับ Command ได้ เพราะ PATH Environment Variable บอกว่าไปหาที่ไหน Variable นี้ List Valid Directories สำหรับ OS Search Commands ไม่ว่าจะ ls หรือ cp หรือ Graphical App เช่น Firefox, Lutris หรืออะไรก็ตาม
Environment Variables ต่างๆ ถูกใช้โดย Systems ต่างๆ PATH Vital ต่อ Terminal Emulator แต่ Less Significant ต่อ Java (มี Paths ของตัวเอง Point ไป Java Libraries) แต่ USER Variable ใช้หลาย Systems ระบุว่าใคร Request Service เช่น Multiuser System ต้อง Check Local Mailbox Mail Command รู้ Mail Spool ไหนจาก MAIL และ USER Variables
ตั้งค่า Environment Variable
ปกติ Installer Program ไม่ว่าจะ dnf Fedora, apt Ubuntu, brew Mac, หรือ Custom Installer Update Environment Variables สำหรับ App ใหม่ บางครั้ง Install นอก Toolset ของ Distro ต้อง Manage Environment Variable เอง หรือเลือก Add Environment Variable ตาม Preference หากตัดสินใจเก็บ Apps บางตัวใน Folder bin ใน Home Directory ต้อง Add Directory นั้นเข้า PATH ให้ OS รู้ไปหาที่นั่นตอน Issue Command
Temporary Environment Variables
เพิ่ม Location เข้า Path แบบสร้าง Throw-away Variables ทำงานได้ แต่แค่ตอน Shell ที่ Modify System Path ยัง Open ตัวอย่าง เปิด Bash Shell Modify System Path:
$ export PATH=$PATH:/home/seth/bin
Confirm Result:
$ 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
ปิด Session:
$ exit
เปิดใหม่ ดู PATH Variable:
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
Variable Revert กลับ Default เพราะ PATH ไม่ได้ Set ทุกครั้งที่ Shell ใหม่ Launch ต้อง Config Variables Load ทุกครั้งที่ Shell Launch
Permanent Environment Variables
ตั้งค่า Persistent Environment Variables เองใน Shell Config File พוץพบคือ ~/.bashrc หาก System Admin จัดการหลาย Users ตั้ง Environment Variables ใน Script วางใน Directory /etc/profile.d ได้
Syntax ตั้ง Variable โดย Config File เหมือน Set Variable ใน Shell:
export PATH=$PATH:/snap/bin:/home/seth/bin
ปิด Shell ปัจจุบัน หรือ Force Load Updated Config:
$ . ~/.bashrc
สุดท้าย ดู System Path อีกครั้ง:
$ 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
ตอนนี้ Set ถูกต้อง Include Custom Directory เพิ่มแล้ว
ค้นพบ Environment Variables อื่นๆ
สร้างและจัดการ Environment Variables ได้ตามใจ และบาง Apps ทำเช่นนั้น ทำให้ Environment Variables หลายตัว ไม่ถูกใช้โดย Apps ส่วนใหญ่ หาก Add Arbitrary Variables เอง บางตัวอาจไม่ถูกใช้เลย คำถาม: หาได้ยังไงว่า Environment Variables ไหน Meaningful?
คำตอบอยู่ใน Documentation ของ Application ตัวอย่าง หาตัวเลือกสำหรับ General Bash Environment อ่าน Bash Documentation Man Page Bash เลือกหลาย Variables สำคัญ แต่ GNU Info Page Bash มี 2 Exhaustive Lists ของ Bourne Shell และ Bash Environment Variables ที่มีประโยชน์ และแต่ละตัวใช้ยังไง
ตัวอย่างใน Info Page List:
'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'.
[...]
Output บอกว่า HISTCONTROL Environment Variable ควบคุม Bash History Presentation และ Values ที่ Customize Experience ได้ ในตัวอย่าง ignoredups บอก Output ของ history Command Ignore Duplicate Lines
Test ง่าย พิมพ์ Command เดียวกัน 2 ครั้งติดกัน:
$ echo "hello world"
hello world
$ echo "hello world"
hello world
View History หรือ Recent Entries:
$ history | tail -5
996 man bash
997 info bash
998 echo "hello world"
999 echo "hello world"
1000 history
เห็น Duplicate Entries Listed
Set Environment Variable ใหม่ใน .bashrc จาก Info Page:
export HISTCONTROL=$HISTCONTROL:ignorespace:ignoredups
Save แล้ว Load Config ใหม่:
$ source ~/.bashrc
Issue 2 Commands ติดกัน 2 ครั้ง:
$ echo "hello once"
hello once
$ echo "hello once"
hello once
View Recent Entries ใน History:
$ history | tail -5
1000 history
1001 emacs ~/.bashrc
1002 source ~/.bashrc
1003 echo "hello once"
1004 history
Duplicate Entries Collapsed เป็น 1 Entry เพราะ Environment Variable ใหม่ ตาม Info Page ระบุ
หา Relevant Environment Variables ปกติคืออ่าน Documentation ของ App ที่อยากมีผลผลักดัน Environment Variables ส่วนใหญ่ Specific ต่อสิ่งที่ App หนึ่งต้องการ Run Smoothly สำหรับ General Entries Documentation ของ Shell เป็น Logical Place ถ้าเขียน Scripts หรือ Apps ต้องการ Environment Variables ใหม่ ต้อง Define Variables เหล่านั้นใน Documentation ของตัวเอง