จะแสดงรายการชื่อตัวแปรทั้งหมดและค่าปัจจุบันอย่างไร


348

จะแสดงรายการชื่อตัวแปรทั้งหมดและค่าปัจจุบันอย่างไร

รวมทั้งไม่เพียง$HOME, $PWDฯลฯ แต่อื่น ๆ ที่คุณได้กำหนดไว้



คุณยอมรับคำตอบที่ไม่ถูกต้อง "printenv" ให้ตัวแปรสภาพแวดล้อมเท่านั้น หากคุณต้องการตัวแปรทั้งหมดที่ประกาศในเชลล์ของคุณอย่างแท้จริงให้ใช้ "declare -p" หรือ "typeset -p"
Florin Andrei

คำตอบ:


479

สำหรับ bash: (เชลล์มาตรฐานใน Ubuntu)

ป้อนคำสั่งต่อไปนี้ในเทอร์มินัลเพื่อพิมพ์ตัวแปรสภาพแวดล้อมทั้งหมด:

printenv

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งนี้อ่านหน้าคนprintenv


หากต้องการแสดงรายการรวมถึง "ตัวแปรหอย" คุณสามารถป้อนคำสั่งถัดไป:

( set -o posix ; set ) | less

สิ่งนี้จะแสดงให้คุณเห็นไม่เพียง แต่ตัวแปรเชลล์เท่านั้น แต่ยังแสดงถึงตัวแปรสภาพแวดล้อมด้วย

สำหรับข้อมูลเพิ่มเติมที่เกี่ยวข้องกับหัวข้อนี้อ่าน:


สำหรับ zsh: (เชลล์ขั้นสูง)

ใช้คำสั่งต่อไปนี้:

( setopt posixbuiltin; set; ) | less

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือก ZSH ดูหน้าคนzshoptions


14
ถ้าฉันไปที่เทอร์มินัลและเขียนMYNEWVARIABLE=Ubuntuและดำเนินการprintenvมันจะไม่แสดงที่นั่น ทำไมเป็นเช่นนั้นและคนอื่น ๆ เหล่านั้นปรากฏตัวอย่างไร
Strapakowsky

4
อาจเป็นไปได้ว่าคุณเห็นความแตกต่างระหว่างตัวแปรเชลล์และตัวแปรสภาพแวดล้อม ลองexport MYNEWVARIABLE=Ubuntuและมันจะทำงานตามที่คุณคาดหวัง
Rmano

3
หากคุณเพียงแค่รันsetมันจะแสดงรายการตัวแปรที่คุณสร้างขึ้นเช่นกัน หรือทำset | grep myvar
Sergiy Kolodyazhnyy

4
printenvเป็นคำสั่งภายนอกดังนั้นจึงรู้เฉพาะเกี่ยวกับ (และพิมพ์) ตัวแปรสภาพแวดล้อมที่ส่งออก setเป็นคำสั่ง bash ภายในดังนั้นจึงแสดง "ตัวแปรตัวแปรเชลล์" ทั้งหมด (ตัวแปรสภาพแวดล้อมที่ไม่ได้เอ็กซ์พอร์ต) รวมถึงตัวแปรสภาพแวดล้อมที่เอ็กซ์พอร์ต
Dan Pritts

1
หากต้องการขยายการตอบกลับของ @ Rmano ถึง @Strapakowsky ... สิ่งนี้จะไม่ทำงานunset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWแต่จะเป็นunset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWเช่นนี้และจะเป็นunset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEWเช่นนี้ การใช้การส่งออกกล่าวว่า "การตั้งค่าตัวแปรฉันควรเป็นส่วนหนึ่งของสภาพแวดล้อมที่ส่งผ่านไปยังกระบวนการไม่ใช่แค่ตัวแปรในเชลล์นี้" ตัวอย่างที่สามของฉันบอกว่า "ตัวแปรควรเป็นส่วนหนึ่งของสภาพแวดล้อมที่ส่งผ่านไปยังกระบวนการนี้
Bruno Bronosky

52

ฉันรู้ว่าคำถามนี้ค่อนข้างเก่าและได้รับคำตอบ แต่ฉันคิดว่าฉันสามารถเพิ่มข้อมูลที่เป็นประโยชน์เล็กน้อย

ในวิธีการทั้งหมดที่อธิบายไว้ข้างต้นขั้นตอนที่แนะนำคือ:

  • เปิดตัวเทอร์มินัล
  • แสดงตัวแปรสภาพแวดล้อมการใช้envหรือ printenvหรืออะไรก็ตาม

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

นี้เป็นที่เห็นได้ชัดตัวอย่างเช่นถ้าคุณใช้ของคุณ~/.profileหรือ.bashrcหรือ.zshenv(ขึ้นอยู่กับเปลือกของคุณ) เพื่อปรับเปลี่ยนตัวแปรสภาพแวดล้อม --- เช่นนอกจากคลาสสิกของไดเรกทอรีไปยังเส้นทาง

หากต้องการดูตัวแปรสภาพแวดล้อมที่แอปพลิเคชันมีให้เริ่มต้นโดยตรงในสภาพแวดล้อมแบบกราฟิกคุณสามารถทำสิ่งต่อไปนี้ (ใน Gnome Shell ฉันแน่ใจว่ามีวิธีการที่เทียบเท่าใน DE อื่นทั้งหมด):

  • กด Alt-F2
  • เรียกใช้คำสั่ง xterm -e bash --noprofile --norc

(หรือถ้าคุณไม่ได้มีxterm, gnome-terminal -- bash --noprofile --norc--- ขอบคุณที่ @ ไมค์ Nakis สำหรับความคิดเห็น)

ตอนนี้คุณมีเทอร์มินัลที่มีเชลล์ที่ไม่ได้เพิ่มตัวแปรสภาพแวดล้อมใด ๆ คุณสามารถใช้envที่นี่เพื่อแสดงรายการตัวแปรสภาพแวดล้อมทั้งหมดของคุณ:

ตัวอย่างเปลือกเปล่า

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

ฉันโพสต์สิ่งนี้เพราะมันเป็นครั้งที่สี่ที่ฉันต้องค้นหาเคล็ดลับนี้อีกครั้งตรวจสอบ.pam_environmentไฟล์ของฉัน ดังนั้นตอนนี้ฉันจะพบว่าเร็วขึ้น (และในกระบวนการฉันหวังว่าจะช่วยคนอื่น ... )


คุณต้องมีสภาพแวดล้อมเดสก์ท็อปซึ่งไม่เป็นประโยชน์สำหรับเซิร์ฟเวอร์ CLI-only เท่านั้น
K7AAY

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

3
ขอบคุณสำหรับคำตอบที่มีประโยชน์มาก! ฉันเพิ่งเชื่อมโยงกับมันจากhelp.ubuntu.com/community/…
Gunnar Hjalmarsson

ขอบคุณ คุณแนะนำxterm -e bash --noprofile --norcเพราะไฟล์เริ่มต้นจะไม่อ่านและดำเนินการเมื่อ Ubuntu เริ่มทำงานด้วยส่วนต่อประสานกราฟิกหรือไม่ ดูaskubuntu.com/q/1025845/1471
ทิม

1
คำสั่งที่ถูกต้องในการใช้งานทุกวันนี้ (Ubuntu 18.04) คือgnome-terminal -- bash --noprofile --norc
Mike Nakis

45

คุณสามารถดูตัวแปรทั้งหมดได้ด้วยdeclarebuiltin

declare -p

หากคุณสนใจเฉพาะตัวแปรสภาพแวดล้อมให้ใช้

declare -xp

เรียกใช้help declareเพื่อดูตัวเลือกอื่น ๆ


นี้อยู่ไกลแก้ปัญหาเรียบร้อยเอ้อกว่าPOSIXLY_CORRECT=1 setและยังมีคุณค่าของการกล่าวถึงว่าdeclareเป็นalias(ในบริบทนั้น) สำหรับtypesetอีก builtin ทุบตี

1
นี่คือคำตอบที่ถูกต้อง
Florin Andrei

12

ในการแสดงรายการตัวแปรสภาพแวดล้อมในเทอร์มินัลด้วย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

เป็นต้น

หวังว่าจะช่วย


ฉันสังเกตเห็นว่า env คิดถึงตัวแปรบางตัว o_O โดยเฉพาะหลังจากการจัดหาไฟล์ VAR = VAL
ThorSummoner

1
@ThorSummoner คำตอบที่นี่อาจช่วยstackoverflow.com/questions/15474650/…
georaldc

7

ในทุบตีโดยใช้ compgen:

compgen -v | while read line; do echo $line=${!line};done  

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากรายการอื่น ๆ ทั้งหมดมีมากกว่าชื่อ ในกรณีของฉันตัวแปรบางตัวมีค่าหลายค่าซึ่งทำให้โซลูชันอื่นไม่สามารถทำได้
Mene

1
ตัวแปร:compgen -v | while read line; do declare -p $line; done
Eljay

4

วิธีแก้ปัญหาส่วนใหญ่ที่นี่พิมพ์เฉพาะตัวแปรสภาพแวดล้อมหรือมีข้อเสียเปรียบที่ 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


1
คำตอบแรกที่ยอดเยี่ยม! +1 ติดตามการทำงานที่ดี!
Fabby

3

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


พูดถึงแล้วเมื่อสองปีที่แล้ว: askubuntu.com/a/276162/158442
muru

@muru ยุติธรรมพอ หวังว่ามันจะทำให้envมองเห็นได้มากขึ้นด้วยการจัดรูปแบบที่ดีขึ้นและฉันได้เพิ่มข้อมูลเพิ่มเติม
Ciro Santilli 新疆改造中心法轮功六四事件

นั่นคือสิ่งที่แก้ไขสำหรับ
Muru

2

หากคุณต้องการตัวแปรสภาพแวดล้อมที่เฉพาะเจาะจงแทนที่จะพิมพ์พวกเขาทั้งหมดด้วยprintenvคุณสามารถยกตัวอย่างเช่นพิมพ์ด้วยการทำecho "$PWD"


0

printenv แสดงรายการตัวแปรที่ส่งออกเท่านั้น command+ alt+ $ ("\ e $": ตัวแปรสมบูรณ์) จะแสดงรายการตัวแปรทั้งหมด

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