นี่คือวิธีแก้ปัญหาบางอย่าง:
$ comm -3 <(declare | sort) <(declare -f | sort)
ชำรุด:
declare
พิมพ์ตัวแปรที่กำหนดไว้ทั้งหมด (ส่งออกหรือไม่) และฟังก์ชั่น
declare -f
พิมพ์ฟังก์ชั่นเท่านั้น
comm -3
จะลบบรรทัดทั้งหมดที่เหมือนกันทั้งสอง ในผลนี้จะลบฟังก์ชั่นเหลือเพียงตัวแปร
หากต้องการพิมพ์เฉพาะตัวแปรที่ไม่ได้ถูกส่งออก:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
วิธีแก้ปัญหาอื่น:
$ declare -p
จะพิมพ์ตัวแปรเท่านั้น แต่มีแอตทริบิวต์ที่น่าเกลียดบางอย่าง
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
คุณสามารถตัดแอททริบิวออกได้โดยใช้ ... cut:
$ declare -p | cut -d " " -f 3
ข้อเสียอย่างหนึ่งคือการที่ค่าของ IFS ถูกตีความแทนการแสดง
เปรียบเทียบ:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
สิ่งนี้ทำให้ยากที่จะใช้เอาต์พุตนั้นสำหรับการประมวลผลเพิ่มเติมเนื่องจากโลน"
ในหนึ่งบรรทัด บางที IFS-fu บางตัวสามารถทำได้เพื่อป้องกันสิ่งนี้
วิธีแก้ปัญหาอื่นโดยใช้compgen
:
$ compgen -v
bash builtin compgen
นั้นมีวัตถุประสงค์เพื่อใช้ในสคริปต์ที่เสร็จสมบูรณ์ ด้วยเหตุนี้compgen -v
รายการตัวแปรที่กำหนดไว้ทั้งหมด ข้อเสีย: มันแสดงเฉพาะชื่อตัวแปรไม่ใช่ค่า
นี่คือแฮ็คที่จะแสดงรายการค่าต่างๆ
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
ข้อดี: มันเป็นโซลูชั่นทุบตีบริสุทธิ์ ข้อเสีย: ค่าบางอย่างจะ messed printf
ขึ้นเนื่องจากการตีความผ่าน นอกจากนี้เชลล์ย่อยจากไพพ์และ / หรือลูปจะเพิ่มตัวแปรพิเศษบางอย่าง