ในสถานีทุบตีลินุกซ์มีตัวแปรสภาพแวดล้อมมักจำนวนมากที่ได้รับการตั้งค่าเช่นและ$PATH$HOME
เป็นไปได้ไหมที่จะเห็นตัวแปรสภาพแวดล้อมทั้งหมดที่ตั้งค่าไว้? อย่างไร?
ในสถานีทุบตีลินุกซ์มีตัวแปรสภาพแวดล้อมมักจำนวนมากที่ได้รับการตั้งค่าเช่นและ$PATH$HOME
เป็นไปได้ไหมที่จะเห็นตัวแปรสภาพแวดล้อมทั้งหมดที่ตั้งค่าไว้? อย่างไร?
คำตอบ:
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ไม่
envคำสั่งที่มีการขัดแย้งจะไม่มีการพิมพ์รายชื่อของ "ส่งออก" ตัวแปรสภาพแวดล้อมและค่านิยมของพวกเขา ตัวแปรเหล่านี้สามารถมองเห็นได้ด้วยโพรเซสซิง - ตัวแปรสภาพแวดล้อมอื่น ๆ จะไม่แสดงพร้อมกับสิ่งนี้และใช้ภายในเชลล์ที่รันอยู่เท่านั้นเช่นการกำหนดค่า
printenvเพราะทั้งคู่envและsetมีฟังก์ชั่นอื่น ๆ มากกว่าเพียงแค่แสดงผลสภาพแวดล้อม
envจะพิมพ์รายการตัวแปรสภาพแวดล้อมที่ทำเครื่องหมายเพื่อส่งออกเท่านั้น มันจะไม่พิมพ์ตัวแปรทั้งหมด
compgen -v
พิมพ์ตัวแปรเชลล์ (แต่ไม่ใช่ค่า)
compgen -e
พิมพ์ตัวแปรที่ส่งออกเช่นตัวแปรที่รับโดยกระบวนการที่เชลล์นี้สตาร์ท (แต่ไม่ใช่ค่าของมัน)
ความแตกต่างระหว่างเชลล์และตัวแปรที่ส่งออก: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1
compgen -eเป็นสิ่งที่ฉันต้องการ!