[英]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.