12

我正在编写一个 python 脚本(Linux),它添加了一些shell 别名(将它们写入HOME/.bash_aliases)。

为了使别名在编写后立即可用,我应该发出以下内置 bash:

source HOME/.bashrc

source是内置的 bash,所以我不能只是:

os.system(source HOME/.bashrc)

如果我尝试类似:

os.system('/bin/bash -c source HOME/.bashrc')

...将冻结脚本(就像在等待某事一样)。

有什么建议么 ?

4

4 回答 4

7

你想要的是不可能的。程序(你的脚本)不能修改调用者的环境(你运行它的 shell)。

另一种允许您做一些接近的方法是用 bash 函数编写它,该函数在同一进程中运行并且可以修改调用者。请注意,在运行时进行采购可能会产生负面影响,具体取决于用户在其 bashrc 中的内容。

于 2010-09-07T18:49:10.070 回答
3

你想做的事情是不可能的。或更好:您尝试如何做到这一点是不可能的。

  1. 你的 bash 命令是错误的。bash -s command不执行command。它只是将字符串“command”存储在变量中$1,然后将您带到提示符处。这就是python脚本似乎冻结的原因。你的意思是bash -c command

  2. 你为什么要采购.bashrc?仅仅来源还不够.bash_aliases吗?

  3. 即使您的 bash 命令正确,更改也只会在从 python 启动的 bash 会话中生效。一旦该 bash 会话关闭,并且您的 python 脚本完成,您将回到原来的 bash 会话。从 python 开始的 bash 会话中的所有更改都将丢失。

每次您想在当前 bash 会话中更改某些内容时,都必须在当前 bash 会话中进行。您从 bash 运行的大多数命令(系统命令、python 脚本,甚至 bash 脚本)都会产生另一个进程,并且您在该其他进程中所做的一切都不会影响您的第一个 bash 会话。

source是一个内置的 bash,它允许您在当前运行的 bash 会话中执行命令,而不是生成另一个进程并在那里运行命令。定义 bash 函数是在当前运行的 bash 会话中执行命令的另一种方法。

有关采购和执行的更多信息,请参阅此答案

你可以做些什么来实现你想要的

修改您的 python 脚本以仅对.bash_aliases.

准备一个 bash 脚本来运行你的 python 脚本,然后 source .bash_aliases.

#i am a bash script, but you have to source me, do not execute me.
modify_bash_aliases.py "$@"
source ~/.bash_aliases

为您添加一个别名以.bashrc获取该脚本

alias add_alias='source modify_bash_aliases.sh'

现在,当您输入add_alias some_aliasbash 提示符时,它将被替换为source modify_bash_aliases.sh然后执行。由于source是内置 bash,脚本中的命令将在当前运行的 bash 会话中执行。python 脚本仍将在另一个进程中运行,但后续source命令将在您当前正在运行的 bash 会话中运行。

其他方式

修改您的 python 脚本以仅对.bash_aliases.

准备一个 bash 函数来运行你的 python 脚本,然后 source .bash_aliases.

add_alias() {
  modify_bash_aliases.py "$@"
  source ~/.bash_aliases      
}

现在您可以像这样调用该函数:add_alias some_alias

于 2010-09-08T14:07:34.253 回答
0

Can I use an alias to execute a program from a python script的工作解决方案:

import subprocess
sp = subprocess.Popen(["/bin/bash", "-i", "-c", "nuke -x scriptpath"])
sp.communicate()
于 2014-01-10T09:46:25.927 回答
0

我有一个有趣的问题,我需要获取一个 RC 文件才能在我的 python 脚本中获得正确的输出。

我最终在我的函数中使用它来从我需要获取的 bash 文件中引入相同的变量。一定要导入操作系统。

with open('overcloudrc') as data:
    lines = data.readlines()

for line in lines:
    var = line.split(' ')[1].split('=')[0].strip()
    val = line.split(' ')[1].split('=')[1].strip()
    os.environ[var] = val
于 2017-07-26T16:12:09.510 回答