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

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

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


当前回答

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

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

其他回答

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

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

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

你没做错什么!您已经更改了目录,但仅在运行脚本的子shell中更改。

您可以使用“dot”命令在当前进程中运行脚本:

. proj

但我更喜欢Greg的建议,在这个简单的案例中使用别名。

要制作一个bash脚本,该脚本将cd到select目录:

创建脚本文件

#!/bin/sh
# file : /scripts/cdjava
#
cd /home/askgelal/projects/java

然后在启动文件中创建别名。

#!/bin/sh
# file /scripts/mastercode.sh
#
alias cdjava='. /scripts/cdjava'

我创建了一个启动文件,在其中转储所有别名和自定义函数。然后我将这个文件源到我的.bashrc中,以便在每次启动时设置它。

例如,创建主别名/函数文件:/scripts/mastercode.sh(将别名放在此文件中。)

然后在.bashrc文件的末尾:

source /scripts/mastercode.sh


现在很容易cd到java目录,只需键入cdjava就可以了。

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