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

#!/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"

其他回答

虽然获取要运行的脚本是一种解决方案,但您应该知道,该脚本可以直接修改当前shell的环境。此外,无法再传递参数。

另一种方法是将脚本实现为bash中的函数。

function cdbm() {
  cd whereever_you_want_to_go
  echo "Arguments to the functions were $1, $2, ..."
}

自动跳转使用此技术:http://github.com/joelthelion/autojump/wiki为您提供学习shell目录书签。

正如其他答案中所解释的,您已经更改了目录,但仅在运行脚本的子shell中更改。这不会影响父shell。

一种解决方案是使用bash函数而不是bash脚本(sh);通过将bash脚本代码放入函数中。这使得该函数可以作为命令使用,然后,它将在没有子进程的情况下执行,因此任何cd命令都会影响调用者shell。

Bash函数:

bash概要文件的一个功能是存储可以在终端或bash脚本中运行的自定义函数,与运行应用程序/命令的方式相同,这也可以用作长命令的快捷方式。

为了使您的功能更高效,您需要在多个文件的末尾复制您的功能

/home/user/.bashrc
/home/user/.bash_profile
/root/.bashrc
/root/.bash_profile

您可以使用sudo kwrite/home/user/.bashrc/home/user/.bash_profile/root/.bashrc/root/.bash_profile快速编辑/创建这些文件

如何:

将bash脚本代码复制到bash配置文件末尾的新函数中,然后重新启动终端,然后就可以运行cdd或编写的任何函数。

脚本示例

正在制作cd的快捷方式。。使用cdd

cdd() {
  cd ..
}

ls快捷方式

ll() {
  ls -l -h
}

ls快捷方式

lll() {
  ls -l -h -a
}

最后使用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

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

alias project=". project"

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

在我的具体案例中,我需要多次更改同一目录。所以在我的.bashrc(我使用ubuntu)上,我添加了

1 -

$纳米~/巴沙尔克

 function switchp
 {
    cd /home/tree/projects/$1
 }

2-

$source~/.bashrc

3 -

$switchp java

它将直接执行:cd/home/tree/projects/java

希望这有帮助!