python3的一些子shell问题

python3的一些子shell问题,python,macos,python-3.x,popen,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_al

嗯,我正在尝试使用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_alias')
时,它将首先打开子shell并执行命令,因此源操作将仅在子shell中生效,而不是在父shell中生效,然后命令完成并关闭子shell。这意味着,
os.system('source~/.bash\u别名')
所做的只是一个细节。

我不熟悉os/X,但我熟悉bash,所以我将对此进行尝试

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

第二,不要从一个子shell中获取脚本,该子shell随后将立即消失。相反,添加如下内容:

source ~/.bash_aliases

在~/.bashrc中,以便在每个新的bash启动时使用它。

它不会解决您的进程问题,但另一种方法是将命令放入shell脚本或
~/.bash\u配置文件中定义的函数定义中

例如,作为脚本:

创建文件
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
将此文件放在
路径中的某个文件夹中,并使其可执行。然后按以下方式运行:

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

或者,您也可以将其作为一个函数,并将该定义添加到
.bash\u配置文件中。(调用函数时也可以使用
$1
。)

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


关于另一种更像“bash”的方法的一些想法…

谢谢,如果我只是想用python脚本创建一个别名,并希望它立即生效,怎么做?如果你想让以前存在的bash得到更改,你需要安排他们为你的新文件提供源。是的,我仍然没有找到一种使用python脚本自动执行“源”操作的方法,也许使用shell脚本而不是python是一个不错的选择……使用shell脚本或函数可能比使用python脚本更好。你有所有的shell命令(除了类,它似乎可以被替换),所以只需将它们放入脚本或包装在一个。好主意,那么,为什么不把你的答案放在下面的答案字段中呢?你从哪里获得路径?运行时的用户输入,或程序中其他地方的硬连线?该路径指向python脚本所在的同一文件夹中的指定配置文件。
disable_alias(){
    mv ~/.bash_aliases.bak ~/.bash_aliases
    source ~/.bash_aliases
}