问:
我试图写一个小脚本来更改当前目录到我的项目目录:
#!/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