ฉันจะดูรายการตัวแปรสภาพแวดล้อมที่กำหนดไว้ในปัจจุบันทั้งหมดใน Linux bash terminal ได้อย่างไร


31

ในสถานีทุบตีลินุกซ์มีตัวแปรสภาพแวดล้อมมักจำนวนมากที่ได้รับการตั้งค่าเช่นและ$PATH$HOME

เป็นไปได้ไหมที่จะเห็นตัวแปรสภาพแวดล้อมทั้งหมดที่ตั้งค่าไว้? อย่างไร?


คำตอบ:


32

TL; DR:ใช้(set -o posix ; set)


ตามคู่มือ Bash คุณสามารถใช้setคำสั่งในตัวเพื่อแสดงตัวแปรสภาพแวดล้อมทั้งหมดที่ตั้งค่าไว้ setคำสั่งจะแสดงคำจำกัดความของฟังก์ชั่นใด ๆ หากคุณต้องการเห็นตัวแปรเท่านั้นไม่ใช่ฟังก์ชั่นคุณสามารถเปิดโหมด POSIX ก่อนที่จะรันคำสั่ง set วิธีที่ง่ายที่สุดที่จะทำคือมีset -o posixแต่ที่จะออกจากโหมด POSIX set +o posixจนกว่าคุณจะปิดด้วย

ดังนั้นคำสั่งต่อไปนี้จะแสดงตัวแปรสภาพแวดล้อมที่กำหนดทั้งหมดโดยใช้ subshell โดยไม่มีผลต่อความสอดคล้องของ POSIX ในเชลล์ปัจจุบันของคุณ

(set -o posix ; set)

@RedGrittyBrick และ @iglvzx แนะนำให้ใช้envคำสั่งอย่างไรก็ตามคำสั่งนี้จะไม่ให้รายชื่อตัวแปรสภาพแวดล้อมที่สมบูรณ์ envจะแสดงเฉพาะ varaibles ที่ถูกทำเครื่องหมายเพื่อส่งออก เปรียบเทียบผลลัพธ์ของenv | sortและexport -pคุณจะเห็นว่าฉันหมายถึงอะไร คุณสามารถเรียกใช้comm -23 <(set -o posix; set) <(env|sort)หากคุณต้องการดูว่าตัวแปรสภาพแวดล้อมใดที่ไม่ได้ถูกส่งออก

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

คุณสามารถทดสอบพฤติกรรมนี้ได้อย่างง่ายดายด้วยตัวเองโดยใช้คำสั่งต่อไปนี้

MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE

คุณจะเห็นว่าsetให้ผลในขณะที่envไม่


24

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


10
ฉันชอบprintenvเพราะทั้งคู่envและsetมีฟังก์ชั่นอื่น ๆ มากกว่าเพียงแค่แสดงผลสภาพแวดล้อม
iglvzx

3
envจะพิมพ์รายการตัวแปรสภาพแวดล้อมที่ทำเครื่องหมายเพื่อส่งออกเท่านั้น มันจะไม่พิมพ์ตัวแปรทั้งหมด
ปลาดาว

4
@Starfish ถูกต้อง - นั่นหมายความว่าคำตอบที่ยอมรับนี้ผิดไปมาก แก้ไขเพื่อบอกว่าเป็นรายการที่ส่งออกตัวแปรเท่านั้น
Volker Siegel

12
compgen -v

พิมพ์ตัวแปรเชลล์ (แต่ไม่ใช่ค่า)

compgen -e

พิมพ์ตัวแปรที่ส่งออกเช่นตัวแปรที่รับโดยกระบวนการที่เชลล์นี้สตาร์ท (แต่ไม่ใช่ค่าของมัน)

ความแตกต่างระหว่างเชลล์และตัวแปรที่ส่งออก: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1


compgen -eเป็นสิ่งที่ฉันต้องการ!
Hao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.