1
我想在shell中運行任意的bash命令,但我只能訪問外殼買運行/bin/bash -c
能/斌/慶典-c出口變量父shell
反正的能夠運行是這樣的:
/bin/bash -c "export FOO=bar"
,然後看看FOO在原殼設置?
我想在shell中運行任意的bash命令,但我只能訪問外殼買運行/bin/bash -c
能/斌/慶典-c出口變量父shell
反正的能夠運行是這樣的:
/bin/bash -c "export FOO=bar"
,然後看看FOO在原殼設置?
號
這是專用的外殼沒有 - 沒有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語言在所有的環境中,因此不支持eval
或source
使用的結果,這給你的能夠使用更安全的流格式,例如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"
...就足夠了。
但是......從哪裏做'/ bin/bash -c'呢? – Pawamoy
來自編程語言。並且像'source'或'eval'或其他bash命令(它們不是文件系統上的文件,如函數等)運行的命令不能被稱爲該編程語言的目錄。 – user1432031
一般來說,不,小孩不能直接改變父母的環境。如果你給出更多關於你的目標是什麼的細節,你可能有其他的方法來完成你想要做的事情(例如,你可以做'FOO = $(bash -c「echo bar」)'或類似的東西儘管不建議爲變量名使用全部大寫字母,以免與特定的內部字符相沖突。 –