我想知道是否可以从 bash 脚本更改 shell 的目录,但将目录更改保留到不仅仅是子 shell。
我知道,当您cd
在 bash 脚本内运行时,目录只会在子 shell 内更改,当您退出时,您将返回到您所在的任何目录。
但是,我想发出一个命令将我带到某些目录。我可以使用别名,但是有很多子目录我必须为其创建别名。
答案1
不,脚本在单独的 shell 中执行,这不会影响其祖先。但是您可以使用带有参数的函数,因此比别名更灵活。另一种选择是使用source
或其等效项获取文件.
,但这不接受参数。尽管如此,它仍然会影响当前的 shell。您可以将这两个函数组合起来并将函数放入您要获取的文件中,然后在当前进程中使用这些函数。
答案2
您可能正在寻找类似CDPATH
shell 变量的东西。
变量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"
.