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

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

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


当前回答

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

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

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

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

如果您使用鱼作为外壳,最好的解决方案是创建一个函数。例如,给定原始问题,您可以复制下面的4行并将它们粘贴到fish命令行中:

function proj
   cd /home/tree/projects/java
end
funcsave proj

这将创建函数并保存以供以后使用。如果项目发生更改,只需使用新路径重复该过程。

如果愿意,可以通过执行以下操作手动添加函数文件:

nano ~/.config/fish/functions/proj.fish

并输入文本:

function proj
   cd /home/tree/projects/java
end

最后按ctrl+x退出,然后按y返回保存更改。

(注意:使用funcsave的第一个方法为您创建proj.fish文件)。

注意讨论如何设置父进程的工作目录?

它包含一些粗俗的答案,例如。https://stackoverflow.com/a/2375174/755804(通过gdb更改父进程目录,不要这样做)和https://stackoverflow.com/a/51985735/755804(将cd目录名注入父进程的输入流的命令tailcd;理想情况下,它应该是bash的一部分,而不是黑客)

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

. script_name

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

source script_name

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

这将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

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