使用 bash 脚本更改当前目录?

使用 bash 脚本更改当前目录?

我想知道是否可以从 bash 脚本更改 shell 的目录,但将目录更改保留到不仅仅是子 shell。

我知道,当您cd在 bash 脚本内运行时,目录只会在子 shell 内更改,当您退出时,您将返回到您所在的任何目录。

但是,我想发出一个命令将我带到某些目录。我可以使用别名,但是有很多子目录我必须为其创建别名。

答案1

不,脚本在单独的 shell 中执行,这不会影响其祖先。但是您可以使用带有参数的函数,因此比别名更灵活。另一种选择是使用source或其等效项获取文件.,但这不接受参数。尽管如此,它仍然会影响当前的 shell。您可以将这两个函数组合起来并将函数放入您要获取的文件中,然后在当前进程中使用这些函数。

答案2

您可能正在寻找类似CDPATHshell 变量的东西。

变量CDPATH的作用类似于PATH命令cd

设置类似

CDPATH=".:~:~/projects:~/music"

会让你说

cd ricky_martin

任何地方,它都会按顺序遍历值:中的 - 分隔的目录路径,$CDPATH直到找到一个名为ricky_martin某个地方(可能~/music/ricky_martin)的子目录,然后cd在那里。

同样地

cd world_domination

~/projects/world_domination如果有这样的子目录,可能会带您到。如果world_domination当前目录中也存在,则将首先选择该目录,因为它较早出现$CDPATH(第一个位置的点)。

它也将被允许做

cd proj1/tests

从任何地方获取~/projects/proj1/tests此类目录是否存在(使用上述$CDPATH值,除非proj/tests当前目录或主目录中不存在)。

请注意,CDPATH不应导出 shell 变量,因为这可能会严重混淆某些脚本。

CDPATH变量记录在bash手册中 ( man bash):

CDPATH

命令的搜索路径cd。这是一个以冒号分隔的目录列表,shell 在其中查找命令指定的目标目录cd。样本值为 ".:~:/usr".

相关内容