Unix shell 变量中“导出”的范围是什么?

Mia*_*ach 6 linux unix bash shell environment-variables

我通过以下方式设置了一些环境变量:

MY_VAR='helloworld'
export MY_VAR
Run Code Online (Sandbox Code Playgroud)

然后我通过切换到另一个用户

su SOME_OTHER_USER
Run Code Online (Sandbox Code Playgroud)

我回应了 MY_VAR 变量..我看到了它的价值!

1)请您解释一下这个问题。据我了解,当我通过 export 命令导出变量时,它不是“全局”导出,它只是一个用户本地变量。为什么我看到了?

2)最初我有一个猜测:可能是,当我切换到另一个用户时,我启动了我的 bash 进程的一些子进程,这就是为什么我可以看到我的变量,因为导出的变量被传递给当前 shell 的任何子进程。但是命令ps ---pid <my bash's pid which I got with echo $$>在输出中只显示相同的 pid。所以看起来这意味着没有与我的 bash 进程相关的子进程,并且 su 没有启动任何进程。我对吗?(顺便说一句,我不会以这种方式看到一个“孩子”,即使我用 bash 命令启动另一个 bash,我也不知道为什么)

3) 最后,谁能看到我以这种方式导出的变量?鉴于我从我的操作系统 GUI 启动了一些其他进程 - 我即将看到它吗?看起来没有,因为如果我启动另一个终端,我在那里看不到它。那么我导出的变量的范围和生命周期是多少?

我使用 Debian Wheezy。我在 Root 用户下从 RootTerminal 运行我的命令。

Sco*_*ott 4

    \n
  • 好吧,首先,我认为你的意思ps --pid是不是ps ---pid
  • \n
  • 您不需要 \ echo $$n然后将数字键入;\nit\ 足以键入.\xc2\xa0 除非您正在谈论ps --pid numberps --pid $$

    \n\n
    # echo $$\n42\n# su joe\n% ps --pid 42\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    在这种情况下,你正在做正确的事情。

  • \n
  • 你在期待什么?

    \n\n
    \n

    --pid 进程列表

    \n\n
      按进程 ID 选择。\xc2\xa0 与-pp相同。
    \n\n


    \n -p pidlist

    \n\n
      按 PID 选择。\xc2\xa0\n 这将选择其进程 ID 号出现在pidlist中的进程。\xc2\xa0\n 与p--pid相同。
    \n
    \n\n

    因此,当您这样做时,\n您将仅获得 shell 进程的输出行。\xc2\xa0\n您可能会发现更有用;\nit 将显示包含任何位置的任何行,\n包括在PPID 列。\xc2\xa0\n即,它将显示 shell 的子进程。\xc2\xa0\n但是,当然,会发现类似.ps --pid PID_of_shellpsps -l | grep PID_of_shellPID_of_shellgrep 427428

  • \n
  • 你的猜测是对的;环境变量从父级传递到子级。\xc2\xa0\n如上所述,您的sushell 是登录 shell\n(或其他父级 shell)的子级。\xc2\xa0\n但是请注意,进程可以更改它的环境;\nsudo因执行此操作而有些臭名昭著,\nand\xc2\xa0su也这样做(例如,它会更改$USER$LOGNAME$HOME\n除非您指定--preserve-environment,\n如果您指定 则更改更多--login)。\xc2\xa0\n另外,进程可以向其子进程传递与其正在使用的环境\n不同的环境;当您说出类似\n .\xc2\xa0\nReferences: 1 , 2 之类的内容时,shell 就会执行此操作。PAGER=cat man man_page_topic
  • \n
  • 所以,不,如果您在一个终端的 shell 中设置(导出)环境变量,然后通过窗口管理器启动另一个终端,\nit 将看不到该环境变量,因为它不是子\n(或\xc2\xa0\n但是,如果从 shell启动一个新的终端窗口(例如,通过xterm&),\n则该终端窗口将继承 shell 的环境。
  • \n
\n