我有一个看起来像这样的脚本:
export foo=/tmp/foo
export bar=/tmp/bar
Run Code Online (Sandbox Code Playgroud)
每次我构建时都运行'source init_env'(其中init_env是上面的脚本)来设置一些变量.
为了在Python中实现同样的目的,我运行了这个代码,
reg = re.compile('export (?P<name>\w+)(\=(?P<value>.+))*')
for line in open(file):
m = reg.match(line)
if m:
name = m.group('name')
value = ''
if m.group('value'):
value = m.group('value')
os.putenv(name, value)
Run Code Online (Sandbox Code Playgroud)
但后来有人决定在init_env文件中添加如下行:
export PATH="/foo/bar:/bar/foo:$PATH"
Run Code Online (Sandbox Code Playgroud)
显然我的Python脚本崩溃了.我可以修改Python脚本来处理这一行,但是当有人想出一个在init_env文件中使用的新功能时,它就会破坏.
问题是,是否有一种简单的方法来运行Bash命令并让它修改我的os.environ?
我希望我的应用程序通过Android上的标准联系人界面提示用户创建新联系人.然后我希望能够从新创建的联系人中读取信息.
我的代码基于此网站的"添加新联系人" .
Intent intent = new Intent(Intent.ACTION_INSERT);
intent.setType(Contacts.CONTENT_TYPE);
intent.putExtra(ContactsContract.Intents.Insert.PHONE, number);
startActivityForResult(intent, PICK_CONTACT);
Run Code Online (Sandbox Code Playgroud)
然后
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Intent intent = new Intent(this, Foo.class);
Uri uri = data.getData(); //I get nullpointer here on ICS
intent.putExtra("contact", ContactAccessor.getInstance().loadContact(this, uri));
startActivity(intent);
finish();
}
Run Code Online (Sandbox Code Playgroud)
此代码在Android 2.2和2.3上运行良好.它启动联系人应用程序,让用户输入名称和电子邮件地址之类的东西,当它们完成后点击"确定"或"保存"或"无论什么"它返回到我的应用程序,我可以阅读他们输入的内容.在Android 4.0(ICS)上,当用户完成创建联系人时,它不会返回到我的应用程序.当我退出联系人视图(通过后退按钮)时,它不包含任何具有联系信息的意图.
我应该用什么意图在ICS上获得相同的行为?
我想使用ssh在不同的机器上启动几个作业.如果用户然后中断主脚本我想要优雅地关闭所有作业.
以下是我正在尝试做的一个简短示例:
#!/bin/bash
trap "aborted" SIGINT SIGTERM
aborted() {
kill -SIGTERM $bash2_pid
exit
}
ssh -t remote_machine /foo/bar.sh &
bash2_pid=$!
wait
Run Code Online (Sandbox Code Playgroud)
但是bar.sh进程仍在运行远程计算机.如果我在终端窗口中执行相同的命令,它将关闭远程主机上的进程.
当我运行bash脚本时,是否有一种简单的方法可以实现这一点?或者我是否需要让它登录到远程计算机,找到正确的进程并以这种方式杀死它?
编辑:似乎我必须使用选项B,通过另一个ssh连接杀死remotescript
所以我不想知道如何获得remotepid?我尝试了一些类似的东西:
remote_pid=$(ssh remote_machine '{ /foo/bar.sh & } ; echo $!')
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它阻止.
如何等待变量打印然后"释放"子流程?