【问题标题】:Changing a directory of the parent shell [duplicate]更改父外壳的目录[重复]
【发布时间】:2012-02-28 09:19:09
【问题描述】:

我想知道有什么机制可以用来从子 shell 更改父 shell 的目录。例如,我在 $HOME 中运行脚本 "settings.sh"。我的 $HOME 有一个目录 $HOME/TEST/run。如果我的 "settings.sh" 脚本如下

    #!/bin/bash

    # some shell related code
    # some shell related code

    cd $HOME/TEST/run

    exit 0

我在 $HOME 的命令提示符下执行上述脚本。执行后,我希望我的命令提示符在目录 $HOME/TEST/run 中。我明白在子 shell 中,它被 cd'd 到 $HOME/TEST/run,但在执行结束时,它又回到 $HOME。

是否有任何优雅的方式来执行上述操作,使用单个脚本。 一种方法是修改脚本“settings.sh”生成另一个脚本,然后使用“.$HOME/generatedScript.sh”

【问题讨论】:

  • 在我回答之前,我一定错过了你问题的底部。为什么需要“生成”另一个脚本?将您需要的内容放入 settings.sh 脚本并获取它有什么问题?
  • 脚本主体更改 $PATH 以执行仅脚本“settings.sh”所需的特定应用程序。我不希望 $PATH 在父 shell 中受到影响。

标签: bash sh csh tcsh


【解决方案1】:

不,你不能。这是设计使然。如果子进程不想受到影响,父进程永远不应该受到子进程的影响(否则子 shell 可能会对父进程做各种令人讨厌的棘手事情)。

您可以做的是让外壳程序将信息保存到文件中或打印目录或......这样如果父母愿意,父母至少可以使用它来更改目录。

【讨论】:

    【解决方案2】:

    Wes Hardaker 解释了为什么执行该脚本不会导致它更改父 shell 的目录的原因。为了解决此类问题,您必须“获取”脚本而不是执行它。这会导致脚本中的命令在当前 shell 中运行,而不是在子进程中运行。

    . ./settings.sh
    

    第一个“.”是一个命令,它告诉外壳程序“来源”指定的文件。这是来自help .的文档:

    .: .文件名 [参数] 从当前 shell 中的文件执行命令。

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.
    
    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2020-09-11
      • 2017-09-17
      相关资源
      最近更新 更多