2016-06-10 58 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" 

...就足夠了。