python3的一些子shell问题
嗯,我正在尝试使用python3脚本来管理MAC OS X上的别名。首先,我将所有别名命令放在一个文件中,并尝试使用以下代码来打开/关闭这些别名: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
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
相当于启用fileB.txt
)
关于另一种更像“bash”的方法的一些想法…谢谢,如果我只是想用python脚本创建一个别名,并希望它立即生效,怎么做?如果你想让以前存在的bash得到更改,你需要安排他们为你的新文件提供源。是的,我仍然没有找到一种使用python脚本自动执行“源”操作的方法,也许使用shell脚本而不是python是一个不错的选择……使用shell脚本或函数可能比使用python脚本更好。你有所有的shell命令(除了类,它似乎可以被替换),所以只需将它们放入脚本或包装在一个。好主意,那么,为什么不把你的答案放在下面的答案字段中呢?你从哪里获得路径?运行时的用户输入,或程序中其他地方的硬连线?该路径指向python脚本所在的同一文件夹中的指定配置文件。
disable_alias(){
mv ~/.bash_aliases.bak ~/.bash_aliases
source ~/.bash_aliases
}