2016-09-29 56 views
3

在試圖回答a question for another user,我碰到的東西,引起了我的好奇:腳本結束後可能更改目錄並保持更改嗎?

import os 
os.chdir('..') 

將盡可能的Python而言改變工作目錄,所以如果我在/home/username/,我跑os.chdir('..'),任何後續代碼將會像我在/home/一樣工作。例如,如果我再做:

import glob 
files = glob.glob('*.py') 

files將在/home/而非/home/username/.py文件列表。但是,只要腳本退出,我將回到/home/username/,或從最初運行腳本的任何目錄中。

我發現shell腳本也會發生同樣的情況。如果我有以下腳本:

#!/bin/bash 

cd /tmp 
touch foo.txt 

/home/username/運行該腳本將在/tmp/創建一個文件foo.txt,但是當腳本完成後,我仍然會在/home/username//tmp/

我很好奇,如果有一些根本原因在這些情況下,工作目錄沒有改變「永久」,如果有的方式永久地改變它,例如,與~$ python myscript.py運行一個腳本,當腳本完成執行時,腳本從不同的目錄運行到終端。

+2

這個假設每個運行這些腳本的用戶都知道它最終會改變他們的shell目錄,否則這種行爲將會相當令人驚訝。 –

+0

@MosesKoledoye我沒有考慮到這一點。如果用戶不知道發生了什麼,確實會非常混亂和危險。我正在考慮用戶想要並預期這種行爲的情況。就像也許它是工作流程的一部分,在腳本運行後,他們需要在shell中執行一些操作,但是在另一個目錄中,並且腳本爲他們保存了必須在那裏導航的步驟。 – elethan

+0

我覺得在終端/工作區方面腳本應該更像沙箱,當然除了IO操作或引發異常外。好問題,認爲*全*。 –

回答

1

沒有辦法做到這一點,因爲調用Python或bash會在它們自己的上下文中運行一切(當腳本結束時結束)。

您可以使用source來實現這些結果,因爲那樣會在當前shell中真正執行您的(shell)腳本。即用source foomaker.bash而不是bash foomaker.bash

+0

非常有趣!我沒有意識到'source'就是這樣工作的!因此,如果'source'將在當前shell中執行腳本,那麼腳本通常在哪裏執行? – elethan

+2

如果你用'bash foomaker.bash'調用它,它將在bash子shell中執行。基本上這與在一行中運行這些命令沒有什麼不同:'bash'(打開一個新的bash shell) - >'cd foo'(在子shell中的cd) - >'exit'(返回頂層shell ) –

+0

謝謝!是的,我剛纔讀到這個:http://tldp.org/LDP/abs/html/subshel​​ls。HTML,這對我很有幫助。 – elethan