好吧,我正在尝试使用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')
所做的只是静脉。
答案 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'的方法的一些想法......