0

好吧,我正在尝试使用 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')所做的一切都是顺理成章的。

4

2 回答 2

0

我不熟悉 OS/X,但我熟悉 bash,所以我会对此进行尝试。

首先,查看 Python 的 shutil 模块和/或 subprocess 模块;os.system 和 os.popen 不再是做这些事情的最佳方式。

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

source ~/.bash_aliases

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

于 2013-11-13T04:00:51.903 回答
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 文件中可能是个好主意。将别名的副本作为自己的文件A.txt B.txt等也可能更简单,只需cp A.txt ~/.bash_aliases使用 enable 命令而不使用 disable 命令(例如,disable相当于启用文件B.txt。)

只是对另一种更“类似bash”的方法的一些想法......

于 2013-11-13T06:49:32.550 回答