我正在尝试编写一个小脚本,将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件保存为proj,使用chmod添加了执行权限,并将其复制到/usr/bin。当我呼叫它时:proj,它什么都不做。我做错了什么?
我正在尝试编写一个小脚本,将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件保存为proj,使用chmod添加了执行权限,并将其复制到/usr/bin。当我呼叫它时:proj,它什么都不做。我做错了什么?
当前回答
如果您使用鱼作为外壳,最好的解决方案是创建一个函数。例如,给定原始问题,您可以复制下面的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文件)。
其他回答
正如其他答案中所解释的,您已经更改了目录,但仅在运行脚本的子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
}
您可以组合别名和脚本,
alias proj="cd \`/usr/bin/proj !*\`"
前提是脚本回显目标路径。请注意,这些是脚本名称周围的反引号
例如,您的脚本可以是
#!/bin/bash
echo /home/askgelal/projects/java/$1
这种技术的优点是,脚本可以接受任意数量的命令行参数,并发出由可能复杂的逻辑计算的不同目的地。
脚本中的cd在技术上起作用,因为它改变了运行脚本的shell的目录,但这是一个独立于交互式shell的过程。
解决这个问题的Posix兼容方法是定义shell过程,而不是shell调用的命令脚本。
jhome () {
cd /home/tree/projects/java
}
您只需键入或将其放入各种shell启动文件之一即可。
Shell脚本在子Shell中运行,每个子Shell都有自己的当前目录的概念。cd成功了,但是一旦子Shell退出,你就回到了交互式Shell中,没有任何改变。
解决此问题的一种方法是改用别名:
alias proj="cd /home/tree/projects/java"
cd在脚本的shell中完成。当脚本结束时,shell退出,然后您将留在原来的目录中。“源”脚本,不要运行它。而是:
./myscript.sh
do
. ./myscript.sh
(请注意脚本名称前的点和空格。)