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

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

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


当前回答

这是一个老问题,但我真的很惊讶,我在这里没有看到这个技巧

您可以使用

export PWD=the/path/you/want

无需创建子外壳或使用别名。

请注意,您有责任确保/path/you/want存在。

其他回答

Shell脚本在子Shell中运行,每个子Shell都有自己的当前目录的概念。cd成功了,但是一旦子Shell退出,你就回到了交互式Shell中,没有任何改变。

解决此问题的一种方法是改用别名:

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

这将Serge的回答与David的不相关回答结合起来。它更改目录,然后启动用户的默认shell,而不是强制使用bash shell。然而,它需要getent和/etc/passwd来检测默认shell。

#!/usr/bin/env bash
cd desired/directory
USER_SHELL=$(getent passwd <USER> | cut -d : -f 7)
$USER_SHELL

当然,这仍然具有创建嵌套外壳的相同缺陷。

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

alias project=". project"

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

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

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

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

您只需键入或将其放入各种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