ในสถานีทุบตีลินุกซ์มีตัวแปรสภาพแวดล้อมมักจำนวนมากที่ได้รับการตั้งค่าเช่นและ$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
เป็นสิ่งที่ฉันต้องการ!