我正在尝试编写一个小脚本,将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件保存为proj,使用chmod添加了执行权限,并将其复制到/usr/bin。当我呼叫它时:proj,它什么都不做。我做错了什么?
我正在尝试编写一个小脚本,将当前目录更改为我的项目目录:
#!/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"
其他回答
我通过使用获得了代码<您的文件名>
./<您的文件名>不起作用,因为它不会更改终端中的目录,只是更改特定于该脚本的目录。
这是我的计划
#!/bin/bash
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace
这是我的终端
nova:~ Kael$
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$
您可以组合别名和脚本,
alias proj="cd \`/usr/bin/proj !*\`"
前提是脚本回显目标路径。请注意,这些是脚本名称周围的反引号
例如,您的脚本可以是
#!/bin/bash
echo /home/askgelal/projects/java/$1
这种技术的优点是,脚本可以接受任意数量的命令行参数,并发出由可能复杂的逻辑计算的不同目的地。
它只更改脚本本身的目录,而当前目录保持不变。
您可能希望改用符号链接。它允许您创建文件或目录的“快捷方式”,因此您只需键入cd my project之类的内容。
这将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
当然,这仍然具有创建嵌套外壳的相同缺陷。
如果您使用鱼作为外壳,最好的解决方案是创建一个函数。例如,给定原始问题,您可以复制下面的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文件)。