更改父shell的目录

时间:2012-02-06 21:58:10

标签: bash sh csh tcsh

我想知道可以用来从子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到$ HOME / TEST / run,但是在执行结束时,它又回到了$ HOME。

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

2 个答案:

答案 0 :(得分:5)

不,你不能。这是设计的。如果孩子没有想要受到影响,父进程永远不会受到结果的影响(否则子shell可以向父母做各种令人讨厌的棘手事情)。

您可以做的是让shell将信息保存到文件中或打印目录或...如果父母想要,父母至少可以使用它来更改目录。

答案 1 :(得分:2)

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

. ./settings.sh

第一个“。”是一个命令,告诉shell“源”指定的文件。以下是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.