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

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

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


当前回答

cd在脚本的shell中完成。当脚本结束时,shell退出,然后您将留在原来的目录中。“源”脚本,不要运行它。而是:

./myscript.sh

do

. ./myscript.sh

(请注意脚本名称前的点和空格。)

其他回答

当您启动shell脚本时,它会运行该shell的一个新实例(/bin/bash)。因此,脚本只需启动一个shell,更改目录并退出。换句话说,shell脚本中的cd(和其他此类命令)不会影响或访问启动它们的shell。

您可以使用。要在当前shell环境中执行脚本,请执行以下操作:

. script_name

或者可选地,其更可读但特定于外壳的别名源:

source script_name

这避免了子shell,并允许任何变量或内置(包括cd)影响当前shell。

您可以在.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 
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace

这是我的终端

nova:~ Kael$ 
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$ 

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

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

. proj

但我更喜欢Greg的建议,在这个简单的案例中使用别名。