小编get*_*kha的帖子

在Python中模拟Bash'source'

我有一个看起来像这样的脚本:

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

python bash

81
推荐指数
5
解决办法
6万
查看次数

添加联系人意图不会返回ICS下的onActivityResult数据

我希望我的应用程序通过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上获得相同的行为?

android android-intent android-4.0-ice-cream-sandwich

15
推荐指数
1
解决办法
2819
查看次数

使用bash在ssh上启动进程,然后在sigint上将其杀死

我想使用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)

这不起作用,因为它阻止.

如何等待变量打印然后"释放"子流程?

ssh bash signals

12
推荐指数
2
解决办法
1万
查看次数