9

我的 bash 脚本:

#!/bin/bash
cd /tmp

在运行我的脚本之前:

pwd: /

运行我的脚本后:

pwd: /

在通过采购它运行我的脚本之后:

pwd: /tmp

我如何在不采购脚本的情况下保持脚本的路径?

4

6 回答 6

14

你不能。对当前目录的更改只会影响当前进程。

于 2010-12-16T14:14:28.627 回答
6

让我详细说明一下:

运行脚本时,bash 会为其创建一个新进程,对当前目录的更改只会影响该进程。

当您获取脚本时,脚本由您正在运行的 shell 直接执行,无需创建额外的进程,因此对当前目录的更改对您的主 shell 进程可见。

因此,正如 Ignacio 指出的那样,这是无法做到的

于 2010-12-16T14:20:39.343 回答
3

伊格纳西奥是正确的。然而,作为一个令人发指的黑客(完全不明智的建议,这真的应该让我至少 10 票反对)你可以在完成后执行一个新的 shell

#!/bin/bash
...
光盘 /
执行 bash
于 2010-12-16T14:17:15.643 回答
3

这是一个愚蠢的想法。使用 PROMPT_COMMAND。例如:

$ export PROMPT_COMMAND='test -f $CDFILE && cd $(cat $CDFILE) && rm $CDFILE'
$ 导出 CDFILE=/tmp/cd.$$

然后,将脚本的最后一行设为 'pwd > $CDFILE'

于 2010-12-16T17:58:17.823 回答
2

如果你真的需要这种行为,你可以让你的脚本返回目录,然后以某种方式使用它。就像是:

#!/bin/bash
cd /tmp
echo $(pwd)

然后你可以

cd $(./script.sh)

丑陋,但在这个简单的情况下可以解决问题。

于 2010-12-16T17:46:25.783 回答
1

您可以定义一个在当前 shell 中运行的函数来支持这一点。例如

md() { mkdir -p "$1" && cd "$1"; }

我的 ~/.bashrc 中有以上内容

于 2010-12-16T15:56:23.547 回答