【问题标题】:Possible to change directory and have change persist when script finishes?脚本完成后可以更改目录并保持更改吗?
【发布时间】:2016-09-29 18:18:20
【问题描述】:

在尝试回答 a question for another user 时,我遇到了一些引起我好奇心的事情:

import os
os.chdir('..')

就 Python 而言将更改工作目录,因此如果我在 /home/username/ 中,并且我运行 os.chdir('..'),任何后续代码都将像我在 /home/ 中一样工作。例如,如果我这样做:

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

files 将是/home/ 中的.py 文件列表,而不是/home/username/ 中的列表。但是,一旦脚本退出,我就会回到/home/username/,或者我最初运行脚本的任何目录。

我发现 shell 脚本也会发生同样的事情。如果我有以下脚本:

#!/bin/bash

cd /tmp
touch foo.txt

/home/username/ 运行脚本将在/tmp/ 中创建一个文件foo.txt,但是当脚本完成时,我仍将在/home/username/ 而不是/tmp/

我很好奇在这些情况下是否有一些根本原因导致工作目录没有“永久”更改,以及是否有一种方法可以永久更改它,例如运行脚本使用~$ python myscript.py,并在脚本完成执行时让运行脚本的终端位于不同的目录中。

【问题讨论】:

  • 这假设每个运行脚本的用户都知道它最终会改变他们的 shell 目录,否则行为会相当令人惊讶。
  • @MosesKoledoye 我没有考虑到这一点。如果用户不知道发生了什么,那确实会非常混乱和危险。我正在考虑用户想要并期望该行为的情况。就像它可能是工作流程的一部分,在脚本运行后,他们需要在 shell 中做一些事情,但在不同的目录中,脚本为他们节省了必须导航到那里的步骤。
  • 我觉得脚本在终端/工作区方面应该更像沙箱,当然除了有 IO 操作或抛出异常。好问题;想充分
  • 取决于您的操作系统。某些版本的 Windows 有一个 setx 控制台命令,该命令将对环境变量进行“永久”更改(并且实际上可能存在底层的 win32 API 调用)。

标签: python


【解决方案1】:

没有办法做到这一点,因为调用 Python 或 bash 将在它们自己的上下文中运行所有内容(当脚本结束时结束)。

您可以通过使用source 来实现这些结果,因为这实际上会在当前shell 中执行您的(shell)脚本。即,使用source foomaker.bash 而不是bash foomaker.bash 调用您的示例脚本

【讨论】:

  • 非常有趣!我没有意识到source 是这样工作的!那么如果source会在当前shell中执行脚本,那么脚本在哪里正常执行呢?
  • 如果你用bash foomaker.bash调用它,它将在一个bash子shell中执行。基本上这与连续运行这些命令没有什么不同:bash(打开一个新的 bash shell)->cd foo(在子 shell 中 cd)->exit(返回顶级 shell)跨度>
  • 谢谢!是的,我刚刚读到这个:tldp.org/LDP/abs/html/subshells.html,这对我很有帮助。
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2014-04-12
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多