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

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

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


当前回答

您可以执行以下操作:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash

编辑:这也可以是“虚线”,以防止创建后续的壳。

例子:

. ./previous_script  (with or without the first line)

其他回答

最后使用exec bash

bash脚本在其当前环境或其儿童,但决不依赖其父母环境。

然而,这个问题经常被问到,因为在从另一个目录中执行bash脚本之后,人们希望留在某个目录中的(新的)bash提示符处。

如果是这种情况,只需在脚本末尾执行一个子bash实例:

#!/usr/bin/env bash
cd /home/tree/projects/java
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
exec bash

要返回到上一个父bash实例,请使用Ctrl+D。

使现代化

至少在更新版本的bash中,不再需要最后一行的exec。此外,可以使用$shell环境变量使脚本与任何首选的shell一起工作。然后得出:

#!/usr/bin/env bash
cd desired/directory
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL

脚本中的cd在技术上起作用,因为它改变了运行脚本的shell的目录,但这是一个独立于交互式shell的过程。

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

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

您只需键入或将其放入各种shell启动文件之一即可。

您不需要脚本,只需设置正确的选项并创建环境变量即可。

shopt -s cdable_vars

在~/.bashrc中,允许cd到环境变量的内容。

创建这样的环境变量:

export myjava="/home/tree/projects/java"

您可以使用:

cd myjava

其他替代方案。

你可以结合Adam&Greg的别名和圆点方法,做出更具活力的东西-

alias project=". project"

现在运行项目别名将在当前shell中执行项目脚本,而不是子shell。

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

./myscript.sh

do

. ./myscript.sh

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