python3的一些subShell问题

时间:2013-11-13 03:41:19

标签: python macos python-3.x popen

好吧,我正在尝试使用python3脚本来管理我的MAC OS X上的别名。首先我将所有别名命令放在一个文件中并尝试使用下面的代码来打开/关闭这些别名:

def enable_alias(self):
    alias_controller = AliasListControl() # just a simple class to handle the single file path and other unimportant things.
    os.popen('cp ~/.bash_aliases ~/.bash_aliases.bak')
    os.popen('cat ' + alias_controller.path + '>> ~/.bash_aliases')
    os.system('source ~/.bash_aliases')

def disable_alias(self):
    os.popen('mv ~/.bash_aliases.bak ~/.bash_aliases')
    os.popen('source ~/.bash_aliases')# maybe I should call some other unalias commands there 

如您所见,存在问题。当脚本运行到os.system('source ~/.bash_aliases')时,它将首先打开一个子shell并执行命令,因此源操作只会在子shell中生效,而不是父shell,然后命令结束并且子shell关闭。这意味着os.system('source ~/.bash_aliases')所做的只是静脉。

2 个答案:

答案 0 :(得分:0)

我对OS / X并不熟悉,但我对bash很熟悉,所以我会对此有所了解。

首先,看看Python的shutil模块和/或子进程模块; os.system和os.popen不再是做这些事情的最佳方式。

其次,不要从后来会立即消失的子shell中获取脚本。相反,添加如下内容:

source ~/.bash_aliases
在你的〜/ .bashrc中

,以便在每个新的bash启动时使用它。

答案 1 :(得分:0)

它没有解决您的流程问题,但另一种方法是将您的命令放入shell脚本或~/.bash_profile中定义的函数定义。

例如,作为脚本:

创建文件enable_alias.sh

filename=$1
cp ~/.bash_aliases ~/.bash_aliases.bak
# If you use `cat` here, your aliases file will keep getting longer and longer with repeated definitions...  think you want to use > not >>
cp /path/to/$1.txt ~/.bash_aliases    
source ~/.bash_aliases

将此文件放在PATH的文件夹中,并使其可执行。然后运行它:

enable_alias.sh A

..您的设置文件等称为A.txt。 $ 1将传递第一个值作为文件名。

或者,您可以将其作为一项功能执行,并将该定义添加到.bash_profile。 (调用时函数也可以$1。)

disable_alias(){
    mv ~/.bash_aliases.bak ~/.bash_aliases
    source ~/.bash_aliases
}

正如您所说,将unalias命令放入.bash_aliases文件中也是一个好主意。使用enable命令将别名副本作为自己的文件A.txt B.txt等只有cp A.txt ~/.bash_aliases并且根本不使用disable命令也可能更简单(disable例如,相当于启用文件B.txt。)

关于另一种更像'bash-like'的方法的一些想法......