繁体   English   中英

python3的一些subShell问题

[英]Some subShell problems with python3

好吧,我正在尝试使用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') ,它将首先打开A子外壳并执行命令,因此源操作仅在子外壳中生效,而不在父外壳中生效,然后命令完成并关闭了子壳。 这意味着os.system('source ~/.bash_aliases')所做的只是os.system('source ~/.bash_aliases')

我不熟悉OS / X,但是我熟悉bash,因此我将对此进行介绍。

首先,研究Python的shutil模块和/或子进程模块; os.system和os.popen不再是完成这些操作的最佳方法。

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

source ~/.bash_aliases

在您的〜/ .bashrc中,以便在每次启动新bash时都会使用它。

它不能解决您的过程问题,但是另一种方法是将命令放入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文件中。 将别名的副本作为自己的文件A.txt B.txt等,并且仅使用enable命令使用cp A.txt ~/.bash_aliases ,而根本不使用disable命令,则可能更简单( disable等效于启用文件例如B.txt 。)

只是对另一种更像“扑朔迷离”的方法的想法...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM