簡體   English   中英

python3的一些subShell問題

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM