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