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 mà bất kỳ khác mà bạn đã xác định.
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 mà bất kỳ khác mà bạn đã xác định.
Câu trả lời:
Đố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 printenv
trang 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 zshoptions
trang man .
MYNEWVARIABLE=Ubuntu
và thực hiện printenv
thì 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?
export MYNEWVARIABLE=Ubuntu
và nó sẽ làm việc như bạn mong đợi.
set
, nó cũng liệt kê biến do bạn tạo. Hoặc làmset | grep myvar
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 được xuất. set
là 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.
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 đó."
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à:
env
,
printenv
hoặ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):
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:
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_environment
tệ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 ...)
xterm -e bash --noprofile --norc
vì 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
gnome-terminal -- bash --noprofile --norc
Bạn có thể thấy tất cả các biến với declare
nộ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ì.
POSIXLY_CORRECT=1 set
và nó cũng là xứng đáng đề cập đến đó declare
là alias
(trong bối cảnh đó) cho typeset
, một BUILTIN bash.
Để liệt kê các biến môi trường trong terminal với CTRL+ ALT+, Tbạn có thể sử dụng env
lệ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.
Trong bash bằng compgen:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
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.
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
env
hiể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.
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.