如何使用脚本更改调用shell的工作目录?

如何使用脚本更改调用shell的工作目录?

可能的重复:
使用脚本更改当前工作目录

我正在尝试创建一些脚本来更改主 shell/终端的工作目录。无法这样做。我尝试了以下方法

文件 p1.sh

#!/bin/bash
cd /home/mtk/work/project1

文件代码.sh

#!/bin/bash
cd /home/mtk/templates/resusable/sampleCodes

但我知道上面的内容只会改变它本身,即当前正在运行的,在这种情况下是p1.shor code.sh

请告诉我,如何更改父调用 shell 的当前工作目录。

示例运行和期望:

$ pwd
/home/mtk
$ p1.sh
$ pwd
/home/mtk    ### --> Expected /home/mtk/work/project1

笔记

我的用例是:我想做一些处理,然后将提示符放置到预定义的目录中。

编辑

我知道为什么它不起作用。这alias似乎是这种情况的解决方案。但我想扩展一下我的问题:

我需要创建一个脚本来动态更改父 shell 的工作目录。剧本会说mycd.sh。它将具有命令行参数 mycd.sh -c/-p1/-p2/或其他一些用户定义的参数。

给予-c会将外壳工作目录切换到相应的目录。文件mycd.sh看起来像

.. some processing
# parameter parsing
if [ $param1 -eq "c" ]; then
    # change working dir of parent here
else 
... other conditions

我想,一定有某种方法可以更改 shell 工作目录。

如果有任何不清楚的地方,请告诉我。

答案1

使用别名为此,例如

alias p1='cd /home/mtk/work/project1'
alias code='cd /home/mtk/templates/resusable/sampleCodes'

您应该将这些行放入 shell 的启动脚本中,例如 ~/.bashrc.

另一种选择是使用外壳函数。这有点复杂; shell 函数比别名具有一些优势,但在这种情况下,您不需要这些额外的功能。

function p1 { cd /home/mtk/work/project1; }
function code { cd /home/mtk/templates/resusable/sampleCodes; }

答案2

您无法从执行 shell 更改调用 shell

其他应用程序(例如)似乎遵循操作调用 shell 的正常方法dircolors是让脚本回显cd(或任何)命令(而不是执行它),然后要求调用 shell 将调用包装在eval

这可能不适用于您的情况,因为您尝试做的不仅仅是在脚本中设置调用 shell,并且依赖于调用者实际知道要做什么。

例如

#!/bin/bash
#somescript.sh
echo cd /some/path

然后

eval `./somescript.sh`

出于安全考虑,它也有点令人皱眉;o)

相关内容