จะแสดงรายการชื่อตัวแปรทั้งหมดและค่าปัจจุบันอย่างไร
รวมทั้งไม่เพียง$HOME
, $PWD
ฯลฯ แต่อื่น ๆ ที่คุณได้กำหนดไว้
จะแสดงรายการชื่อตัวแปรทั้งหมดและค่าปัจจุบันอย่างไร
รวมทั้งไม่เพียง$HOME
, $PWD
ฯลฯ แต่อื่น ๆ ที่คุณได้กำหนดไว้
คำตอบ:
สำหรับ bash: (เชลล์มาตรฐานใน Ubuntu)
ป้อนคำสั่งต่อไปนี้ในเทอร์มินัลเพื่อพิมพ์ตัวแปรสภาพแวดล้อมทั้งหมด:
printenv
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งนี้อ่านหน้าคนprintenv
หากต้องการแสดงรายการรวมถึง "ตัวแปรหอย" คุณสามารถป้อนคำสั่งถัดไป:
( set -o posix ; set ) | less
สิ่งนี้จะแสดงให้คุณเห็นไม่เพียง แต่ตัวแปรเชลล์เท่านั้น แต่ยังแสดงถึงตัวแปรสภาพแวดล้อมด้วย
สำหรับข้อมูลเพิ่มเติมที่เกี่ยวข้องกับหัวข้อนี้อ่าน:
สำหรับ zsh: (เชลล์ขั้นสูง)
ใช้คำสั่งต่อไปนี้:
( setopt posixbuiltin; set; ) | less
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือก ZSH ดูหน้าคนzshoptions
MYNEWVARIABLE=Ubuntu
และดำเนินการprintenv
มันจะไม่แสดงที่นั่น ทำไมเป็นเช่นนั้นและคนอื่น ๆ เหล่านั้นปรากฏตัวอย่างไร
export MYNEWVARIABLE=Ubuntu
และมันจะทำงานตามที่คุณคาดหวัง
set
มันจะแสดงรายการตัวแปรที่คุณสร้างขึ้นเช่นกัน หรือทำset | grep myvar
printenv
เป็นคำสั่งภายนอกดังนั้นจึงรู้เฉพาะเกี่ยวกับ (และพิมพ์) ตัวแปรสภาพแวดล้อมที่ส่งออก set
เป็นคำสั่ง bash ภายในดังนั้นจึงแสดง "ตัวแปรตัวแปรเชลล์" ทั้งหมด (ตัวแปรสภาพแวดล้อมที่ไม่ได้เอ็กซ์พอร์ต) รวมถึงตัวแปรสภาพแวดล้อมที่เอ็กซ์พอร์ต
unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
แต่จะเป็นunset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
เช่นนี้และจะเป็นunset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW
เช่นนี้ การใช้การส่งออกกล่าวว่า "การตั้งค่าตัวแปรฉันควรเป็นส่วนหนึ่งของสภาพแวดล้อมที่ส่งผ่านไปยังกระบวนการไม่ใช่แค่ตัวแปรในเชลล์นี้" ตัวอย่างที่สามของฉันบอกว่า "ตัวแปรควรเป็นส่วนหนึ่งของสภาพแวดล้อมที่ส่งผ่านไปยังกระบวนการนี้
ฉันรู้ว่าคำถามนี้ค่อนข้างเก่าและได้รับคำตอบ แต่ฉันคิดว่าฉันสามารถเพิ่มข้อมูลที่เป็นประโยชน์เล็กน้อย
ในวิธีการทั้งหมดที่อธิบายไว้ข้างต้นขั้นตอนที่แนะนำคือ:
env
หรือ
printenv
หรืออะไรก็ตามปัญหาของการแก้ปัญหาเหล่านี้ที่คุณจะเห็นตัวแปรสภาพแวดล้อมของเปลือกที่ใช้เข้ากับขั้วต่อ คุณไม่เห็นตัวแปรสภาพแวดล้อมที่แอปพลิเคชันสามารถเรียกใช้ได้ตัวอย่างเช่นโดยตรงจากส่วนต่อประสานกราฟิก
นี้เป็นที่เห็นได้ชัดตัวอย่างเช่นถ้าคุณใช้ของคุณ~/.profile
หรือ.bashrc
หรือ.zshenv
(ขึ้นอยู่กับเปลือกของคุณ) เพื่อปรับเปลี่ยนตัวแปรสภาพแวดล้อม --- เช่นนอกจากคลาสสิกของไดเรกทอรีไปยังเส้นทาง
หากต้องการดูตัวแปรสภาพแวดล้อมที่แอปพลิเคชันมีให้เริ่มต้นโดยตรงในสภาพแวดล้อมแบบกราฟิกคุณสามารถทำสิ่งต่อไปนี้ (ใน Gnome Shell ฉันแน่ใจว่ามีวิธีการที่เทียบเท่าใน DE อื่นทั้งหมด):
xterm -e bash --noprofile --norc
(หรือถ้าคุณไม่ได้มีxterm
, gnome-terminal -- bash --noprofile --norc
--- ขอบคุณที่ @ ไมค์ Nakis สำหรับความคิดเห็น)
ตอนนี้คุณมีเทอร์มินัลที่มีเชลล์ที่ไม่ได้เพิ่มตัวแปรสภาพแวดล้อมใด ๆ คุณสามารถใช้env
ที่นี่เพื่อแสดงรายการตัวแปรสภาพแวดล้อมทั้งหมดของคุณ:
เห็นได้ชัดว่าเชลล์ใหม่จะมีตัวแปรสภาพแวดล้อมที่เพิ่มขึ้นโดยไฟล์ระบบ แต่ตัวแปรนั้นควรพร้อมใช้งาน (โดยการสืบทอด) ให้กับทุกโปรแกรมในระบบอย่างไรก็ตาม
ฉันโพสต์สิ่งนี้เพราะมันเป็นครั้งที่สี่ที่ฉันต้องค้นหาเคล็ดลับนี้อีกครั้งตรวจสอบ.pam_environment
ไฟล์ของฉัน ดังนั้นตอนนี้ฉันจะพบว่าเร็วขึ้น (และในกระบวนการฉันหวังว่าจะช่วยคนอื่น ... )
xterm -e bash --noprofile --norc
เพราะไฟล์เริ่มต้นจะไม่อ่านและดำเนินการเมื่อ Ubuntu เริ่มทำงานด้วยส่วนต่อประสานกราฟิกหรือไม่ ดูaskubuntu.com/q/1025845/1471
gnome-terminal -- bash --noprofile --norc
คุณสามารถดูตัวแปรทั้งหมดได้ด้วยdeclare
builtin
declare -p
หากคุณสนใจเฉพาะตัวแปรสภาพแวดล้อมให้ใช้
declare -xp
เรียกใช้help declare
เพื่อดูตัวเลือกอื่น ๆ
POSIXLY_CORRECT=1 set
และยังมีคุณค่าของการกล่าวถึงว่าdeclare
เป็นalias
(ในบริบทนั้น) สำหรับtypeset
อีก builtin ทุบตี
ในการแสดงรายการตัวแปรสภาพแวดล้อมในเทอร์มินัลด้วยCTRL+ ALT+ Tคุณสามารถใช้env
คำสั่ง
ตัวอย่างเช่น :
[raja@localhost ~]$ env
XDG_VTNR=1
SSH_AGENT_PID=3671
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/home/raja/.gnupg/S.gpg-agent:3691:1
GLADE_PIXMAP_PATH=:
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=xfce-
DESKTOP_STARTUP_ID=
HISTSIZE=1000
XDG_SESSION_COOKIE=0250277dd805498381e96c05d88068b0-1364679772.845276-1676152201
WINDOWID=65011716
GNOME_KEYRING_CONTROL=/home/raja/.cache/keyring-N3QoQ2
IMSETTINGS_MODULE=none
QT_GRAPHICSSYSTEM_CHECKED=1
USER=raja
เป็นต้น
หวังว่าจะช่วย
ในทุบตีโดยใช้ compgen:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
วิธีแก้ปัญหาส่วนใหญ่ที่นี่พิมพ์เฉพาะตัวแปรสภาพแวดล้อมหรือมีข้อเสียเปรียบที่ env หรือ (set -o posix; posix) ไม่ได้พิมพ์ค่าในรูปแบบที่แยกวิเคราะห์ได้ (ลองพิมพ์ตัวแปร A = $ 'a \ r \ nb' ... ) .
นี่คือฟังก์ชั่นที่จะพิมพ์ตัวแปรทั้งหมดหนึ่งตัวแปรต่อบรรทัดในรูปแบบ POSIX ที่หลบหนี:
function dump_vars {
local VARNAME
compgen -v | while read -r VARNAME; do
printf "$VARNAME=%q\n" "${!VARNAME}"
done
}
ขอบคุณ @tmgoblin สำหรับการชี้การใช้งาน compgen -v
envเป็นวิธีPOSIX 7 :
export asdf=qwer
env | grep asdf
ตัวอย่างผลลัพธ์:
asdf=qwer
จะแสดงเฉพาะตัวแปรที่ส่งออกเท่านั้น: โดยปกติแล้วตัวแปรที่ไม่ได้ถูกส่งออกจะไม่ถือว่าเป็น "ตัวแปรสภาพแวดล้อม"
ชอบที่มากกว่าprintenv
ซึ่งไม่ใช่ POSIX ทั้งสองดูเหมือนจะทำสิ่งเดียวกันโดยไม่มีข้อโต้แย้ง: https://unix.stackexchange.com/questions/123473/what-is-the-the-difference-between-env-and-printenv
env
มองเห็นได้มากขึ้นด้วยการจัดรูปแบบที่ดีขึ้นและฉันได้เพิ่มข้อมูลเพิ่มเติม
หากคุณต้องการตัวแปรสภาพแวดล้อมที่เฉพาะเจาะจงแทนที่จะพิมพ์พวกเขาทั้งหมดด้วยprintenv
คุณสามารถยกตัวอย่างเช่นพิมพ์ด้วยการทำecho "$PWD"
printenv แสดงรายการตัวแปรที่ส่งออกเท่านั้น command+ alt+ $ ("\ e $": ตัวแปรสมบูรณ์) จะแสดงรายการตัวแปรทั้งหมด