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

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

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


当前回答

代替将脚本文件和cd执行到特定文件夹,

我们可以通过以下方式实现:

源或。特定shell脚本别名cd命令定义一个函数ant cd to folder

示例:

. script
# or
source script
alias ghqc='cd $(ghq root)/$(ghq list | fzf)'
ghqc() {
  cd $(ghq root)/$1
}

其他回答

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

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

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

杰里米·鲁滕(Jeremy Ruten)使用符号链接的想法引发了一个没有任何其他答案的想法。使用:

CDPATH=:$HOME/projects

前导结肠很重要;这意味着如果当前目录中有一个目录“dir”,那么“cd dir”将更改为该目录,而不是跳到其他位置。使用如图所示的值设置,可以执行以下操作:

cd java

而且,如果当前目录中没有名为java的子目录,那么它将直接将您带到$HOME/projects/java-没有别名、没有脚本、没有可疑的exec或dot命令。

我的$HOME是/Users/jleffler;我的$CDPATH是:

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work

如果您使用鱼作为外壳,最好的解决方案是创建一个函数。例如,给定原始问题,您可以复制下面的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文件)。

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

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

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

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

我有一个名为p的简单bash脚本来管理目录更改ongithub.com/godzilla/bash-stuff只需将脚本放在本地bin目录(/usr/local/bin)中并将

alias p='. p'

在你的.bashrc中