2016-06-10 62 views
1

我想在shell中运行任意的bash命令,但我只能访问外壳买运行/bin/bash -c能/斌/庆典-c出口变量父shell

反正的能够运行是这样的:

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

,然后看看FOO在原壳设置?

+1

但是......从哪里做'/ bin/bash -c'呢? – Pawamoy

+0

来自编程语言。并且像'source'或'eval'或其他bash命令(它们不是文件系统上的文件,如函数等)运行的命令不能被称为该编程语言的目录。 – user1432031

+3

一般来说,不,小孩不能直接改变父母的环境。如果你给出更多关于你的目标是什么的细节,你可能有其他的方法来完成你想要做的事情(例如,你可以做'FOO = $(bash -c“echo bar”)'或类似的东西尽管不建议为变量名使用全部大写字母,以免与特定的内部字符相冲突。 –

回答

3

这是专用的外壳没有 - 没有UNIX进程可以更改父进程的环境变量没有履行一个接口,父进程(例如,从stdout中读出新的变量/值)。

考虑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 -able壳代码;然而,由于这被用于执行任意命令,支持这个接口是一个安全风险。


因为你的目标是shell命令来修改程序,它是不是一个shell语言在所有的环境中,因此不支持evalsource使用的结果,这给你的能够使用更安全的流格式,例如NUL分隔的流。举例来说,如果你的shell程序\0写道key=val\0对,用文字NUL字符,你可以做一些类似于下面的Python:

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

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

printf '%s=%s\0' "$key" "$val" 

...就足够了。