Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ PowerShell: จัดการ Environment Variables บน Windows และ Linux

Environment Variables เป็น Global Settings สำหรับคอมพิวเตอร์ Linux, Mac, หรือ Windows เก็บไว้ให้ System Shell ใช้ตอน Execute Commands หลายตัว Set By Default ระหว่าง Installation หรือ User Creation

เช่น Home Directory ถูก Set เป็น Environment Variable ตอน Login ลักษณะใน PowerShell ขึ้นอยู่กับ OS

บน Windows:

PS C:\Users\bogus> Get-Variable HOME -valueOnly
C:\Users\bogus

บน Linux:

pwsh> Get-Variable HOME -valueOnly
HOME=/home/seth

บน Mac:

pwsh> Get-Variable HOME -valueOnly
HOME=/Users/bogus

ปกติไม่ใช้ Environment Variables โดยตรง แต้อ้างอิงโดย Applications และ Daemons ตามความต้องการ อย่างไรก็ตาม Environment Variables มีประโยชน์ตอน Override Default Settings หรือจัดการ Settings ใหม่ที่ System ไม่มีเหตุผลสร้างเอง

บทความนี้เกี่ยวกับ Environment Variables ใน Open Source PowerShell Environment ใช้ได้กับ PowerShell บน Windows, Linux, Mac ผู้ใช้ Bash Shell อ่านบทความ Bash Environment Variables แทน

สำหรับบทความนี้ รัน PowerShell บน Linux Open Source คำสั่งเหมือนกันทุก Platform แต่อุทพุตต่างกัน (เช่น สถิติ Username เป็น seth ไม่น่าจะเป็นคุณ)

Environment Variables คืออะไร?

Environment Variables ใน PowerShell เป็น Variables พิเศษ ให้ข้อมูลเกี่ยวกับ OS Environment ด้วย Environment Variables สามารถ View และ Change Variables ใน Windows Registry และ Variables ที่ Set สำหรับ Session เฉพาะ

ใน PowerShell Environment Variables เก็บใน Drive Env: เข้าถึงได้ผ่าน PowerShell Environment Provider Subsystem ของ PowerShell นี่ไม่ใช่ Physical Drive แตเป็น Virtual File System

เพราะ Environment Variables อยู่ใน Drive Env: ต้อง Prepend Env: หน้าชื่อ Variable ตอน Reference หรือ Set Working Location เป็น Drive Env: ด้วย Set-Location ให้ Treat Environment Variables ทั้งหมดเป็น Local Variables:

PS> Set-Location Env:
PS> pwd

Path
----
Env:/

Environment Variables สื่อสารข้อมูล Login Session ไปยัง Computer เช่น Application ต้องการทราบว่า Save Data File Default ที่ไหน มักเรียก HOME Environment Variable คุณไม่เคย Set HOME เอง แต่มันมีอยู่ เพราะ Environment Variables ส่วนใหญ่ Managed By OS

ดู Environment Variables ทั้งหมดบน System ด้วย Get-ChildItem จากภายใน Drive Env: List ยาว Pipe ผ่าน out-host -paging อ่านง่าย:

PS> Get-ChildItem | out-host -paging
LOGNAME seth
LS_COLORS rs=0:mh=00:bd=48;5;232;38;5;
MAIL /var/spool/mail/seth
MODULEPATH /etc/scl/modulefiles:/etc/scl/modulefiles
MODULESHOME /usr/share/Modules
OLDPWD /home/seth
PATH /opt/microsoft/powershell/6:/usr/share/Modules/bin
PSModulePath /home/seth/.local/share/powershell/Modules
PWD /home/seth
[...]

หากไม่อยู่ใน Drive Env: ทำได้โดยเพิ่ม Env: ในคำสั่ง:

PS> Get-ChildItem Env: | out-host -paging
LOGNAME seth
LS_COLORS rs=0:mh=00:bd=48;5;232;38;5;
MAIL /var/spool/mail/seth
MODULEPATH /etc/scl/modulefiles:/etc/scl/modulefiles

Environment Variables Set, Recall, Clear ได้ด้วย Syntax เหมือน Normal Variables เหมือน Variables อื่น อะไรที่ Set ระหว่าง Session ใช้ได้แค่ Session นั้น

หากต้องการ Permanent Changes ต้องเปลี่ยนใน Windows Registry บน Windows หรือ Shell Config File (เช่น ~/.bashrc) บน Linux/Mac หากไม่คุ้นเคย Variables ใน PowerShell อ่านบทความ Variables ใน PowerShell ก่อนต่อ

Environment Variables ใช้ทำอะไร?

Environment Variables ต่างๆ ถูกใช้โดย Systems ต่างๆ ใน Computer PATH Variable สำคัญต่อ Shell แต่ Less Significant ต่อ Java (ซึ่งมี Paths ของตัวเอง Point ไป Java Libraries) แต่ USER Variable ใช้หลาย Processes ระบุว่าใคร Request Service

Installer Wizard เช่น NSIS (Nullsoft Scriptable Install System) Framework เปิด Source อัปเดต Environment Variables ตอน Install App ใหม่ บางครั้ง Install นอก Toolset ของ OS ต้อง Manage Environment Variable เอง หรือเลือก Add Environment Variable เพื่อ Preference

ต่างจาก Regular Variables ยังไง?

สร้าง Normal Variable Variable ถือว่า Local ไม่ Defined นอก Shell ที่สร้าง

ตัวอย่าง สร้าง Variable:

PS> Set-Variable -Name VAR -Value "example"
PS> gv VAR -valueOnly
example

Launch Shell ใหม่ แม้จากภายใน Shell ปัจจุบัน:

PS> pwsh
PS c:\> gv VAR -valueOnly
gv : Cannot find a variable with the name 'example'.

Environment Variables ข้างอื่น เป็น Global Scope มีอยู่แยกจาก Shell ที่สร้าง และ Available ให้ Processes อื่น

ตั้งค่า Environment Variable ยังไง?

ตอน Set Environment Variable ควร Explicit ว่าเป็น Environment Variable โดยใช้ Notation $Env::

PS Env:/> $Env:FOO = "hello world"
PS Env:/> Get-ChildItem FOO
hello world

ทดสอบ Launch Session ใหม่ Access Variable ที่สร้าง เพราะเป็น Environment Variable ต้อง Prepend $Env::

PS Env:/> pwsh
PS c:\> $Env.FOO
hello world

แม้ทำให้ Variable ใช้ได้ใน Child Processes มันยังเป็น Temporary Variable ทำงาน Verify ได้ ใช้จาก Process ใดก็ได้ แต่ Destroy เมื่อ Shell ที่สร้างมัน Close

ตั้งค่า Environment Variables ใน Profile ยังไง?

บังคับให้ Environment Variable Persist Across Sessions ต้องเพิ่มใน PowerShell Profile เช่น CurrentUser,AllHosts Profile อยู่ HOME/Documents/Profile.ps1:

PS> Add-Content -Path $Profile.CurrentUserAllHosts -Value '$Env:FOO = "hello world"'

ด้วยบรรทัดนี้ PowerShell Session ใหม่จะ Instantiate FOO Environment Variable ตั้งค่า hello world

มี Default Profiles 6 ตัวควบคุม PowerShell Sessions อ่าน Microsoft Dev Blog เพิ่มเติม

ค้นพบ Environment Variables ใหม่ยังไง?

สร้างและจัดการ Environment Variables ได้ตามใจ และบาง Apps ทำเช่นนั้น ทำให้ Environment Variables หลายตัว ไม่ถูกใช้โดย Apps ส่วนใหญ่ หาก Add Arbitrary Variables เอง บางตัวอาจไม่ถูกใช้เลย

คำถาม: หาได้ยังไงว่า Environment Variables ไหน Meaningful? คำตอบอยู่ใน Documentation ของ Application

Python ตัวอย่าง เสนอ Add Python Path ให้ Path Environment Variable ตอน Install [Note: PATH?] หาก Decline ตั้งค่าเองได้ตอนนี้เพราะรู้วิธี Modify Environment Variables

เหมือนกันสำหรับ App ที่ Install: Installer คาดหวัง Add Variables ให้ Environment คุณไม่ควร Modify Env: เอง หาก Develop App Installer ควรทำให้ Users เดียวกัน

ค้นพบ Significant Variables สำหรับ Individual Applications อ้างอิง User และ Developer Documentation