Làm thế nào để liệt kê tất cả các tên biến và giá trị hiện tại của chúng?


348

Làm thế nào để liệt kê tất cả các tên biến và giá trị hiện tại của chúng?

Bao gồm không chỉ $HOME, $PWDvv mà bất kỳ khác mà bạn đã xác định.



Bạn đã chấp nhận một câu trả lời không chính xác. "Printenv" chỉ cung cấp cho bạn các biến môi trường. Nếu bạn thực sự muốn tất cả các biến hiện được khai báo trong shell của mình, hãy sử dụng "khai báo -p" hoặc "typeet -p".
Florin Andrei

Câu trả lời:


479

Đối với bash: (shell tiêu chuẩn trong Ubuntu)

Nhập lệnh sau trong một thiết bị đầu cuối để in tất cả các biến môi trường:

printenv

Để biết thêm thông tin về lệnh này, đọc printenvtrang man .


Để hiển thị danh sách bao gồm "biến shell", bạn có thể nhập lệnh tiếp theo:

( set -o posix ; set ) | less

Điều này sẽ cho bạn thấy không chỉ các biến shell, mà cả các biến môi trường nữa.

Để biết thêm thông tin liên quan đến chủ đề này, hãy đọc:


Đối với zsh: (vỏ nâng cao)

Sử dụng lệnh sau:

( setopt posixbuiltin; set; ) | less

Để biết thêm thông tin về các tùy chọn ZSH, xem zshoptionstrang man .


14
Nếu tôi đi đến thiết bị đầu cuối và viết MYNEWVARIABLE=Ubuntuvà thực hiện printenvthì nó không hiển thị ở đó. Tại sao vậy, và làm thế nào để những người khác xuất hiện?
Dây đeo

4
Có lẽ bạn đang thấy sự khác biệt giữa biến shell và biến môi trường. Hãy thử export MYNEWVARIABLE=Ubuntuvà nó sẽ làm việc như bạn mong đợi.
Rmano

3
nếu bạn chỉ thực hiện set, nó cũng liệt kê biến do bạn tạo. Hoặc làmset | grep myvar
Sergiy Kolodyazhnyy

4
printenvlà một lệnh bên ngoài, vì vậy nó chỉ biết về (và in) các biến môi trường được xuất. setlà một lệnh bash nội bộ, vì vậy nó hiển thị tất cả các "biến shell" (biến môi trường không được báo cáo) cũng như các biến môi trường được xuất.
Dan Pritts

1
Để mở rộng câu trả lời của @ Rmano cho @Strapakowsky ... Điều này sẽ không hoạt động unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, nhưng điều này sẽ unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, và điều này sẽ unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. Sử dụng export cho biết "biến tôi đang cài đặt phải là một phần của môi trường được truyền cho các tiến trình, không chỉ là một biến trong trình bao này." Ví dụ thứ ba của tôi nói rằng "biến phải là một phần của môi trường được chuyển qua quy trình NÀY, nhưng không bị dính xung quanh sau đó."
Bruno Bronosky

52

Tôi biết rằng câu hỏi này khá cũ và đã được trả lời, nhưng tôi nghĩ rằng tôi có thể thêm một chút thông tin hữu ích.

Trong tất cả các phương pháp được mô tả ở trên, quy trình được đề xuất là:

  • khởi động một thiết bị đầu cuối
  • hiển thị các biến môi trường bằng cách sử dụng env, printenvhoặc bất cứ điều gì

Vấn đề của các giải pháp này là bạn đang thấy các biến môi trường của shell đang chạy vào terminal . Bạn không thấy các biến môi trường có sẵn cho một ứng dụng chạy, ví dụ, trực tiếp bởi giao diện đồ họa.

Điều này đáng chú ý nếu, ví dụ, bạn sử dụng ~/.profile, hoặc .bashrc, hoặc .zshenv(tùy thuộc vào vỏ của bạn) để sửa đổi các biến môi trường --- như việc thêm các thư mục cổ điển vào đường dẫn.

Để xem các biến môi trường có sẵn cho ứng dụng bắt đầu trực tiếp trong môi trường đồ họa, bạn có thể thực hiện các thao tác sau (trong Gnome Shell, tôi chắc chắn có một phương thức tương đương trong tất cả các DE khác):

  • nhấn Alt-F2
  • chạy lệnh xterm -e bash --noprofile --norc

(Hoặc, nếu bạn không có xterm, gnome-terminal -- bash --noprofile --norc--- cảm ơn @Mike Nakis đã nhận xét).

Bây giờ bạn có một thiết bị đầu cuối với một vỏ không thêm bất kỳ biến môi trường nào. Bạn có thể sử dụng envở đây để liệt kê tất cả các biến môi trường của bạn:

Ví dụ về vỏ trần

Rõ ràng shell mới sẽ có các biến môi trường được thêm bởi các tệp hệ thống, nhưng các biến đó nên có sẵn (bằng cách kế thừa) cho tất cả các chương trình trong hệ thống.

Tôi đang đăng bài này vì đây là lần thứ tư tôi phải tìm kiếm lại thủ thuật này, kiểm tra .pam_environmenttệp của tôi . Vì vậy, bây giờ tôi sẽ tìm thấy nó nhanh hơn (và trong quá trình này, tôi hy vọng sẽ giúp được người khác ...)


Yêu cầu bạn có một môi trường máy tính để bàn, không hữu ích cho dân gian chỉ có máy chủ CLI.
K7AAY

5
Có --- nhưng sau đó đối với CLI chỉ có câu trả lời trước là ok. Tôi chỉ chỉ ra rằng đôi khi bạn cần kiểm tra các biến môi trường có sẵn cho ứng dụng được bắt đầu bởi môi trường đồ họa, không giống với tập hợp bạn thấy khi bạn khởi động một thiết bị đầu cuối trong đó. Ví dụ: nếu bạn đang cố gắng hiểu lý do tại sao ứng dụng Kile của bạn không thể biên dịch tệp LaTeX, trong khi trong một thiết bị đầu cuối bạn có thể, mẹo tôi đã đăng ở đây sẽ giúp ích rất nhiều.
Rmano

3
Cảm ơn cho một câu trả lời rất hữu ích! Tôi vừa liên kết với nó từ help.ubfox.com/community/ cấp
Gunnar Hjalmarsson

Cảm ơn. Bạn có đề xuất xterm -e bash --noprofile --norcvì các tệp khởi động không được đọc và thực thi khi Ubuntu được khởi động với giao diện đồ họa không? Xem Askubfox.com/q/1025845/1471
Tim

1
lệnh đúng để thực thi ngày nay (Ubuntu 18.04) làgnome-terminal -- bash --noprofile --norc
Mike Nakis

45

Bạn có thể thấy tất cả các biến với declarenội dung.

declare -p

Nếu bạn chỉ quan tâm đến các biến môi trường, hãy sử dụng

declare -xp

Chạy help declaređể xem các tùy chọn khác là gì.


này còn lâu mới giải pháp gọn gàng-er hơn POSIXLY_CORRECT=1 setvà nó cũng là xứng đáng đề cập đến đó declarealias(trong bối cảnh đó) cho typeset, một BUILTIN bash.

1
Đây là câu trả lời chính xác.
Florin Andrei

12

Để liệt kê các biến môi trường trong terminal với CTRL+ ALT+, Tbạn có thể sử dụng envlệnh.

ví dụ :

[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

Vân vân.

Hy vọng rằng sẽ giúp.


Tôi đã nhận thấy rằng env bỏ lỡ một số biến o_O. cụ thể sau khi tìm nguồn của tệp VAR = VAL.
ThorSummoner

1
@ThorSummoner Câu trả lời ở đây có thể giúp stackoverflow.com/questions/15474650/iêu
georaldc

7

Trong bash bằng compgen:

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

2
Đây phải là câu trả lời được chấp nhận, vì tất cả những người khác liệt kê nhiều hơn chỉ là tên của chính nó. Trong trường hợp của tôi, một số biến chứa các giá trị đa dòng làm cho các giải pháp khác không khả thi.
Mene

1
Một biến thể:compgen -v | while read line; do declare -p $line; done
Eljay 13/12/18

4

Hầu hết các giải pháp ở đây chỉ in các biến môi trường hoặc có nhược điểm là env hoặc (set -o posix; posix) không in các giá trị ở dạng có thể phân tích cú pháp (thử in biến A = $ 'a \ r \ nb' ...) .

Đây là một hàm sẽ in tất cả các biến, một biến trên mỗi dòng, ở dạng thoát POSIX:

function dump_vars {
    local VARNAME
    compgen -v | while read -r VARNAME; do
        printf "$VARNAME=%q\n" "${!VARNAME}"
    done
}

Cảm ơn @tmgoblin đã chỉ ra việc sử dụng compgen -v.


1
Câu trả lời đầu tiên tuyệt vời! +1 Hãy tiếp tục phát huy!
Fabby

3

env là một cách POSIX 7 :

export asdf=qwer
env | grep asdf

Đầu ra mẫu:

asdf=qwer

Nó chỉ hiển thị các biến được xuất: các biến không xuất thường không được coi là "biến môi trường".

Thích hơn printenv, đó không phải là POSIX. Cả hai dường như làm điều tương tự mà không cần tranh luận: https://unix.stackexchange.com/questions/123473/what-is-the-difference-b between-env-and-printenv


Đã được đề cập hai năm trước: Askubfox.com/a/276162/158442
muru

@muru đủ công bằng. Ước gì nó được envhiển thị rõ hơn với định dạng tốt hơn và tôi đã thêm nhiều thông tin hơn.
Ciro Santilli 心 心 事件

Đó là những gì chỉnh sửa dành cho.
muru

2

Nếu bạn muốn một biến môi trường cụ thể, thay vì in tất cả chúng printenv, bạn có thể in nó bằng cách thực hiệnecho "$PWD"


0

printenv chỉ liệt kê các biến được xuất, command+ alt+ $ ("\ e $": biến hoàn chỉnh) sẽ liệt kê tất cả các biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.