可以/ bin / bash -c将变量导出到父shell

时间:2016-06-10 11:33:54

标签: bash sh

我试图在shell中运行任意bash命令,但我只能访问运行/bin/bash -c的shell购买

无论如何都能运行类似的东西:

/bin/bash -c "export FOO=bar"

然后在原始shell中看到FOO设置?

1 个答案:

答案 0 :(得分:3)

没有

这不是特定于shell的 - 没有UNIX进程可以更改父进程的环境变量而没有父进程来表示接口(例如,从stdout读取新的变量/值),或者使用不可靠且不受支持的hackery(比如使用调试器附加到父进程并直接调用setenv())。

ssh-agent为例:

$ ssh-agent
SSH_AUTH_SOCK=/var/folders/t2/t58p1nwx1g38tkhykqfhvmm80000gn/T//ssh-0HSNi1V5h9wf/agent.17313; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17314; export SSH_AGENT_PID;
echo Agent pid 17314;

...因此,记录下使用的模式类似于:

$ eval "$(ssh-agent)"

在这种情况下,该接口是eval - 能够使用shell代码;但是,由于这通常用于执行任意命令,因此支持此接口存在安全风险。

因为你的目标是使用shell命令的结果来修改一个完全没有shell语言的程序的环境,因此不支持eval或{{1这使您能够使用更安全的流格式,例如NUL分隔的流。例如,如果你的shell程序写source对,key=val\0字符NUL,你可以在Python中做类似于以下的事情:

\0

...移植到您选择的语言。从shell写这种格式:

for env_val in s.split('\0'):
  if not env_val.contains('='): continue
  k, v = env_val.split('=', 1)
  environ[k] = v

......就够了。