我正在尝试编写一个小脚本,将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件保存为proj,使用chmod添加了执行权限,并将其复制到/usr/bin。当我呼叫它时:proj,它什么都不做。我做错了什么?
我正在尝试编写一个小脚本,将当前目录更改为我的项目目录:
#!/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"
其他回答
您可以在.bash_profile中创建一个如下所示的函数,它将顺利工作。
以下函数接受一个可选参数,该参数是一个项目。例如,您可以运行
cdproj
or
cdproj project_name
这是函数定义。
cdproj(){
dir=/Users/yourname/projects
if [ "$1" ]; then
cd "${dir}/${1}"
else
cd "${dir}"
fi
}
别忘了获取.bash_profile
您可以执行以下操作:
#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash
编辑:这也可以是“虚线”,以防止创建后续的壳。
例子:
. ./previous_script (with or without the first line)
你没做错什么!您已经更改了目录,但仅在运行脚本的子shell中更改。
您可以使用“dot”命令在当前进程中运行脚本:
. proj
但我更喜欢Greg的建议,在这个简单的案例中使用别名。
Shell脚本在子Shell中运行,每个子Shell都有自己的当前目录的概念。cd成功了,但是一旦子Shell退出,你就回到了交互式Shell中,没有任何改变。
解决此问题的一种方法是改用别名:
alias proj="cd /home/tree/projects/java"
当您启动shell脚本时,它会运行该shell的一个新实例(/bin/bash)。因此,脚本只需启动一个shell,更改目录并退出。换句话说,shell脚本中的cd(和其他此类命令)不会影响或访问启动它们的shell。