Câu hỏi Liệt kê tất cả các biến môi trường và hiển thị nếu chúng được xuất khẩu hay không


(Câu hỏi này tương tự như cái này và cái này, nhưng với yêu cầu bổ sung mà tôi muốn biết liệu các biến có được xuất hay không)

Tôi đang ở bash, Ubuntu 14.04.4 LTS. Tôi muôn:

  • liệt kê tất cả các biến môi trường
  • cho mỗi biến, tôi muốn xem liệu nó có được xuất khẩu hay không

Ngoài ra, tôi muốn liệt kê chỉ có các biến môi trường đã xuất.


2
2018-04-08 08:09


gốc


Bạn có thể giải thích tại sao? Điều này nghe như một Vấn đề XY, bạn cần giải quyết vấn đề gì mà yêu cầu biết liệu biến có được xuất không? - terdon♦
@terdon: bởi vì nó là cách dễ nhất để gỡ lỗi một vấn đề mà tôi có với một nhị phân không hoạt động đúng. Tôi có ấn tượng rằng môi trường không được thiết lập đúng: mặc dù biến được thiết lập, tôi nghĩ rằng nhị phân không có quyền truy cập vào nó trong môi trường của nó. Nó có thể là một vấn đề khác, nhưng trước tiên tôi muốn đảm bảo rằng biến được xuất khẩu đúng trong trình bao hiện tại. - dangonfast
Nếu bạn biết tên của biến và có thể thấy rằng biến đó không được đặt, thì biến đó sẽ không được xuất. Vấn đề là những gì bạn đang yêu cầu ở đây khá phức tạp khi bạn đưa vào tài khoản các biến shell cục bộ, các biến môi trường toàn cục, vv Đơn giản chỉ cần đặt, nếu biến được đặt trong shell cha nhưng không có sẵn cho chương trình, nó không được xuất . - terdon♦
@terdon: và cũng bởi vì tôi tò mò. - dangonfast
Bất cứ điều gì được liệt kê trong env / printenv  Là "xuất khẩu", các biến shell không được liệt kê. Bạn có ý nghĩa gì bởi "đã xuất"? Nếu nó đã được xuất khẩu một cách rõ ràng bằng cách sử dụng export? Hoặc chỉ khi nó ở trong môi trường? - kos


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


Sử dụng declare được xây dựng trong:

$ help declare
declare: declare [-aAfFgilnrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

    Declare variables and give them attributes.  If no NAMEs are given,
    display the attributes and values of all variables.

    Options:
      -f    restrict action or display to function names and definitions
      -F    restrict display to function names only (plus line number and
        source file when debugging)
      -g    create global variables when used in a shell function; otherwise
        ignored
      -p    display the attributes and value of each NAME

    Options which set attributes:
      -a    to make NAMEs indexed arrays (if supported)
      -A    to make NAMEs associative arrays (if supported)
      -i    to make NAMEs have the `integer' attribute
      -l    to convert NAMEs to lower case on assignment
      -n    make NAME a reference to the variable named by its value
      -r    to make NAMEs readonly
      -t    to make NAMEs have the `trace' attribute
      -u    to convert NAMEs to upper case on assignment
      -x    to make NAMEs export

Theo đó:

$ declare -p
declare -- BASH="/usr/bin/bash"
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:nullglob:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -A BASH_CMDS='()'
declare -- BASH_COMMAND
declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -- BASH_SUBSHELL
declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="42" [3]="1" [4]="release" [5]="x86_64-unknown-linux-gnu")'
declare -- BASH_VERSION="4.3.42(1)-release"
declare -x CDPATH=":/home/muru"
declare -x COLORTERM="gnome-terminal"
declare -- COLUMNS="237"
declare -- COMP_WORDBREAKS
declare -x CONFLOCAL="laptop"
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x DESKTOP_AUTOSTART_ID="10abca3e1337cb662146002998494759100000008000003"
declare -x DESKTOP_SESSION="gnome"
declare -a DIRSTACK='()'
declare -x DISPLAY=":0"
declare -x EDITOR="vim"
…

Để chỉ xem các biến môi trường được xuất, hãy sử dụng declare -px:

$ declare -px
declare -x CDPATH=":/home/muru"
declare -x COLORTERM="gnome-terminal"
declare -x CONFLOCAL="laptop"
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x DESKTOP_AUTOSTART_ID="10abca3e1337cb662146002998494759100000008000003"
declare -x DESKTOP_SESSION="gnome"
declare -x DISPLAY=":0"
declare -x EDITOR="vim"
declare -x GDMSESSION="gnome"
…

Hoặc sử dụng các lệnh bên ngoài, như env, printenv, hoặc là:

awk 'BEGIN{for (i in ENVIRON) {print i}}'
perl -e 'print "$_\n" for keys(%ENV)'
python -c 'import os; [print(k) for k in os.environ.keys()]'

6
2018-04-08 08:48