2016-09-29 63 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