我正在尝试编写一个小脚本以将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件另存为proj,使用添加了执行权限chmod
,然后将其复制到/usr/bin
。当我通过以下方式调用它时
proj
,它什么也没做。我究竟做错了什么?
pwd
在最后一行进行测试。所以脚本之前完成,那么你可以检查它正在正常工作或不..
cd
命令在脚本内部运行良好,请自己尝试。
我正在尝试编写一个小脚本以将当前目录更改为我的项目目录:
#!/bin/bash
cd /home/tree/projects/java
我将此文件另存为proj,使用添加了执行权限chmod
,然后将其复制到/usr/bin
。当我通过以下方式调用它时
proj
,它什么也没做。我究竟做错了什么?
pwd
在最后一行进行测试。所以脚本之前完成,那么你可以检查它正在正常工作或不..
cd
命令在脚本内部运行良好,请自己尝试。
Answers:
Shell脚本在一个子Shell中运行,每个子Shell对当前目录都有自己的概念。的cd
成功,但只要子shell退出,你是在交互式背壳和从来都没有改变,因此。
解决此问题的一种方法是改用别名:
alias proj="cd /home/tree/projects/java"
. my-script
或source my-script
。
你没做错什么!您已经更改了目录,但仅在运行脚本的子外壳中进行了更改。
您可以使用“点”命令在当前进程中运行脚本:
. proj
但是我更希望格雷格的建议在这种简单情况下使用别名。
.
也是拼写的source
,请选择您觉得更难忘的一个。
该cd
脚本中的技术工作,因为它改变了运行脚本的外壳的目录,但是这是从你的交互shell分叉一个单独的进程。
解决此问题的Posix兼容方法是定义Shell过程而不是Shell调用命令脚本。
jhome () {
cd /home/tree/projects/java
}
您可以只输入它或将其放在各种Shell启动文件之一中。
jhome(){ cd /home/tree/projects/$1; }
这cd
是在脚本的外壳中完成的。脚本结束时,该外壳程序退出,然后将您留在原来的目录中。“来源”脚本,不要运行它。代替:
./myscript.sh
做
. ./myscript.sh
(请注意脚本名称前的点和空格。)
source
myscript.sh
位于$ PATH中包含的目录中,您也可以从任何地方获取它,而无需指定完整路径。
创建脚本文件
#!/ bin / sh #文件:/ scripts / cdjava # cd / home / askgelal / projects / java
然后在启动文件中创建一个别名。
#!/ bin / sh #文件/scripts/mastercode.sh # 别名cdjava ='。/ scripts / cdjava'
例如,创建一个主别名/功能文件:/scripts/mastercode.sh
(将别名放入此文件中。)
然后在.bashrc文件的末尾:
源/scripts/mastercode.sh
现在可以轻松地将cd插入您的java目录,只需键入cdjava即可。
mastercode.sh
不需要shabang(#!/bin/sh
),因为它不是(也不能)在子shell中执行。但是同时,您确实需要记录该文件的外壳“风味”;例如ksh或bash(或(t)csh / zsh等),几乎可以肯定不是sh
。我通常会添加评论(但不要添加shebang)来传达此信息;例如,“该文件旨在(从bash中获取)而不是作为shell脚本运行。”
source
d中(通过alias
),这些变量将泄漏到您的shell环境中。为了避免这种情况,请在函数中完成脚本的所有工作,然后在脚本末尾调用它。在函数内,声明任何变量local
。
杰里米·鲁滕(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
exec bash
末bash脚本在其当前环境或其子级环境上运行,但绝不在其父级环境上运行。
但是,经常会问这个问题,因为一个人想要在执行后留在某个目录中的(新)bash提示符下另一个目录中 bash脚本,。
如果是这种情况,只需在脚本末尾执行一个子bash实例:
#!/usr/bin/env bash
cd /home/tree/projects/java
exec bash
exit
您将返回运行该脚本的外壳程序。
我通过使用使我的代码工作. <your file name>
./<your file name>
之所以不起作用,是因为它不会更改终端中的目录,而只会更改特定于该脚本的目录。
这是我的程序
#!/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$
. something
和./something
??有什么区别?这个答案对我有用,我不明白为什么。
. something
让你从任何位置运行的脚本,./something
需要你在文件被存储在目录中。
#!. /bin/bash
?
当您启动Shell脚本时,它将运行该Shell()的新实例/bin/bash
。因此,您的脚本仅启动外壳程序,更改目录并退出。换句话说,cd
shell脚本中的(以及其他此类命令)既不影响也不能访问从其启动的shell。
在我的特殊情况下,我需要太多次才能更改同一目录。因此,在我的.bashrc(我使用ubuntu)上,我添加了
1-
$ nano〜。/ bashrc
function switchp
{
cd /home/tree/projects/$1
}
2
$ source〜/ .bashrc
3-
$ switchp java
直接可以执行:cd / home / tree / projects / java
希望有帮助!
您可以执行以下操作:
#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash
编辑:这也可以被“点缀”,以防止创建后续的外壳。
例:
. ./previous_script (with or without the first line)
exit
(或按ctrl + d)多次退出外壳。到输出-别名something =“ cd getnewdirectory.sh
”)
您可以结合使用别名和脚本,
alias proj="cd \`/usr/bin/proj !*\`"
前提是脚本回显目标路径。请注意,这些是脚本名称周围的反引号。
例如,您的脚本可能是
#!/bin/bash
echo /home/askgelal/projects/java/$1
这种技术的优点是脚本可以采用任意数量的命令行参数,并发出可能由复杂逻辑计算出的不同目标。
proj() { cd "/home/user/projects/java/$1"; }
=> proj "foo"
(或proj "foo bar"
<=如果你有空格)...甚至(例如):proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }
=> proj a b c
=>没有一个cd
成/home/user/projects/java/a/b/c
这应该做您想要的。转到感兴趣的目录(从脚本内),然后生成一个新的bash shell。
#!/bin/bash
# saved as mov_dir.sh
cd ~/mt/v3/rt_linux-rt-tools/
bash
如果运行此命令,它将带您到感兴趣的目录,并且在退出时将带您回到原始位置。
root@intel-corei7-64:~# ./mov_dir.sh
root@intel-corei7-64:~/mt/v3/rt_linux-rt-tools# exit
root@intel-corei7-64:~#
退出(CTRL+ d)时,甚至可以带您回到原始目录
LOOOOOng时间过后,但我做了以下事情:
创建一个名为case的文件
将以下内容粘贴到文件中:
#!/bin/sh
cd /home/"$1"
保存然后:
chmod +x case
我也在我的中创建了一个别名.bashrc
:
alias disk='cd /home/; . case'
现在,当我键入:
case 12345
本质上我在输入:
cd /home/12345
您可以在“ case”之后输入任何文件夹:
case 12
case 15
case 17
就像输入:
cd /home/12
cd /home/15
cd /home/17
分别
在我的情况下,路径要长得多-这些家伙更早地用〜信息对其进行了总结。
cd
在别名是多余的和不雅; 别名应该只是'。〜/ case`代替。这case
也是一个保留关键字,因此名称的选择相当糟糕。
如果您将鱼用作外壳,最好的解决方案是创建一个函数。例如,给定原始问题,您可以复制下面的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文件。)
我有一个名为p的简单bash脚本,用于管理
github.com/godzilla/bash-stuff上的目录更改,
只需将脚本放在您的本地bin目录(/ usr / local / bin)中,
然后将
alias p='. p'
在您的.bashrc中
注意讨论如何设置父进程的工作目录?
它包含一些令人毛骨悚然的答案,例如
https://stackoverflow.com/a/2375174/755804(通过gdb更改父进程目录,请不要这样做)和https://stackoverflow.com/a/51985735/755804(tailcd
将cd dirname注入父进程的输入流的命令;理想情况下,它应该是bash的一部分,而不是hack)
这是一个老问题,但我真的很惊讶,我在这里看不到这个窍门
除了使用cd外,您还可以使用
export PWD=the/path/you/want
无需创建子外壳或使用别名。
请注意,您有责任确保/ path / you / want存在。
如其他答案所述,您已经更改了目录,但仅在运行脚本的子外壳中进行了更改。这不会影响父外壳。
一种解决方案是使用bash函数代替bash脚本(sh
);通过将bash脚本代码放入函数中。这使得该功能可以作为命令使用,然后将在没有子进程的情况下执行该函数,因此任何cd
命令都将影响调用程序外壳程序。
重击功能:
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
}