为什么我不能在脚本中使用“cd“来更改目录

问:

我试图写一个小脚本来更改当前目录到我的项目目录:

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

我将这个文件保存为 proj,使用 chmod 添加了执行权限,并将其复制到 /usr/bin。当我调用 proj 时,它什么都不做。我做错了什么?

答1:

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

解决这个问题的一种方法是使用别名:

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

答2:

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

你可以使用 "dot" 命令在当前进程中运行脚本:

. proj

但我更喜欢Greg的建议,在这种简单的情况下使用别名。

答3:

从技术上讲,脚本中的 cd 改变了运行脚本的 shell 的目录,但这是从交互式 shell 派生出来的一个独立进程。

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

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

你可以直接输入这个命令,或者把它放到任意一个 shell 启动文件中。


参考:

stackoverflow question 255414

PS:

  本文首发于公众号: 程序熵, 更多精彩文章请点击关注 code-shang

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值