协慌网

登录 贡献 社区

为什么 “cd” 在 shell 脚本中不起作用?

我正在尝试编写一个小脚本,以将当前目录更改为我的项目目录:

#!/bin/bash
cd /home/tree/projects/java

我将此文件另存为 proj,使用chmod添加了执行权限,并将其复制到/usr/bin 。当我通过以下方式调用它时: proj ,它什么都不做。我究竟做错了什么?

答案

Shell 脚本在子 Shell 中运行,每个子 Shell 对当前目录都有自己的概念。 cd成功,但是一旦子 shell 退出,您就回到了交互式 shell 中,那里什么也没有改变。

解决此问题的一种方法是改用别名:

alias proj="cd /home/tree/projects/java"

你没做错什么!您已经更改了目录,但仅在运行脚本的子外壳中进行了更改。

您可以使用 “点” 命令在当前进程中运行脚本:

. proj

但是我更希望格雷格的建议在这种简单情况下使用别名。

脚本中的cd从技术上来说可以正常运行,因为它更改了运行脚本的 shell 的目录,但这是与交互式 shell 分开的一个独立过程。

解决此问题的 Posix 兼容方法是定义Shell 过程而不是 Shell 调用命令脚本

jhome () {
  cd /home/tree/projects/java
}

您可以只输入它或将其放在各种 Shell 启动文件之一中。