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 运行我的命令。
ps --pid是不是ps ---pid。您不需要 \ echo $$n然后将数字键入;\nit\ 足以键入.\xc2\xa0 除非您正在谈论ps --pid numberps --pid $$
# echo $$\n42\n# su joe\n% ps --pid 42\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,你正在做正确的事情。
你在期待什么?
\n\n\n\n\n--pid 进程列表
\n\n按进程 ID 选择。\xc2\xa0 与-p和p相同。
\n\n\n\n
\n -p pidlist按 PID 选择。\xc2\xa0\n 这将选择其进程 ID 号出现在pidlist中的进程。\xc2\xa0\n 与p和--pid相同。
\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
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_topicxterm&),\n则该终端窗口将继承 shell 的环境。