Câu hỏi 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?


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, $PWD vv nhưng bất kỳ khác bạn đã xác định.


295
2018-03-30 00:36


gốc


superuser.com/questions/420295/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Các câu trả lời:


Nhập lệnh sau vào 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, hãy đọc printenv trang người đàn ông.


Để 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, nhưng các biến môi trường cũng vậy.

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


417
2018-03-30 01:21



Nếu tôi đến nhà ga và viết MYNEWVARIABLE=Ubuntu và thi hành printenv 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? - Strapakowsky
Có lẽ bạn đang thấy sự khác biệt giữa biến shell và biến môi trường. Thử export MYNEWVARIABLE=Ubuntu và nó sẽ hoạt động như bạn mong đợi. - Rmano
nếu bạn chỉ thực hiện set, nó cũng liệt kê biến do bạn tạo ra. Hay làm set | grep myvar - Sergiy Kolodyazhnyy
printenv là 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 đã xuất. set là một lệnh bash bên trong, vì vậy nó hiển thị tất cả các "biến shell" (các biến môi trường chưa được xuất hiện) cũng như các biến môi trường đã xuất. - Dan Pritts
Để 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 MYNEWvà điều này sẽ unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. Sử dụng xuất khẩu cho biết "biến tôi đang thiết lập phải là một phần của môi trường được chuyển đến các quy trình, không chỉ là một biến trong trình bao này". Ví dụ thứ ba của tôi cho biết "biến phải là một phần của môi trường được chuyển đến quy trình NÀY, nhưng không phải là xung quanh sau đó." - Bruno Bronosky


Tôi biết rằng câu hỏi này khá cũ và được trả lời, nhưng tôi nghĩ 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 sử dụng env, hoặc là printenv hay bất cứ cái 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 vỏ đang chạy vào thiết bị đầu cuối. 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 là đáng chú ý nếu, ví dụ, bạn sử dụng của bạn ~/.profile, hoặc là .bashrc, hoặc là .zshenv (tùy thuộc vào trình bao của bạn) để sửa đổi các biến môi trường --- như bổ sung cổ điển của các thư mục 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

Bây giờ bạn có một terminal với một shell không thêm bất kỳ biến môi trường nào. Bạn có thể dùng env ở đây để liệt kê tất cả các biến môi trường của bạn:

Example of the bare shell

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

Tôi đăng bài này bởi vì đây là lần thứ tư tôi phải tìm lại mẹo này, kiểm tra .pam_environment tập tin. 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 giúp đỡ người khác ...)


43
2017-10-12 00:37



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 máy chủ CLI-only dân gian. - K7AAY
Có --- nhưng sau đó cho CLI chỉ câu trả lời trước là ok. Tôi đã chỉ ra rằng đôi khi bạn cần phải kiểm tra các biến môi trường có sẵn cho ứng dụng bắt đầu bởi môi trường đồ họa, mà không phải là cùng một bộ bạn thấy khi bạn bắt đầu một thiết bị đầu cuối trong đó. Ví dụ, nếu bạn đang cố gắng hiểu tại sao ứng dụng Kile của bạn không thể biên dịch một 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
Cảm ơn bạn đã trả lời rất hữu ích! Tôi chỉ liên kết với nó từ help.ubuntu.com/community/… - Gunnar Hjalmarsson
Cảm ơn. Bạn đã giới thiệu xterm -e bash --noprofile --norc bởi vì các tập tin khởi động không được đọc và thực hiện khi Ubuntu được bắt đầu với giao diện đồ họa? Xem askubuntu.com/q/1025845/1471 - Tim
@Tim về cơ bản nó chỉ là một cách để có một vỏ mà không có bất cứ điều gì nhiều hơn các biến môi trường có sẵn cho môi trường đồ họa. Một thiết bị đầu cuối tiêu chuẩn sẽ đọc (hoặc đọc lại) .bashrc ví dụ... - Rmano


Bạn có thể xem tất cả các biến với declare được xây dựng trong.

declare -p

Nếu bạn chỉ quan tâm đến 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ì.


32
2018-04-04 20:28



đây là giải pháp gọn gàng hơn POSIXLY_CORRECT=1 set và nó cũng xứng đáng đề cập đến declare Là alias (trong bối cảnh đó) cho typeset, một nội trang khác. - w17t


Để liệt kê các biến môi trường trong terminal CTRL+ALT+T bạn có thể dùng env chỉ huy.

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.v.

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


11
2018-03-30 16:41



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 cung cấp một tập tin VAR = VAL. - ThorSummoner
@ThorSummoner Câu trả lời ở đây có thể giúp stackoverflow.com/questions/15474650/… - georaldc


Trong bash sử dụng compgen:

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

3
2018-04-11 20:53



Đây sẽ 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 giá trị nhiều giá trị khiến các giải pháp khác không khả thi. - Mene


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

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 được xuất khẩu thường không được xem là "biến môi trường".

Ưu tiên hơn printenv, không phải POSIX. Cả hai dường như làm điều tương tự mà không có đối số: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv


2
2017-11-30 14:31



Đã được đề cập hai năm trước: askubuntu.com/a/276162/158442 - muru
@muru đủ công bằng. Ước gì nó đã làm env hiển thị nhiều hơn với định dạng tốt hơn và tôi đã thêm thông tin khác. - Ciro Santilli 新疆改造中心 六四事件 法轮功
Đó là gì chỉnh sửa là cho. - muru


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


0
2018-01-08 14:13