Bash 为什么可以';t我使用“更改目录”;cd";在剧本里?

Bash 为什么可以';t我使用“更改目录”;cd";在剧本里?,bash,shell,cd,Bash,Shell,Cd,我正在尝试编写一个小脚本,将当前目录更改为我的项目目录: #!/bin/bash cd /home/tree/projects/java 我将此文件保存为proj,使用chmod添加了执行权限,并将其复制到/usr/bin。当我叫它的时候: proj,它什么也不做。我做错了什么?Shell脚本在子Shell中运行,每个子Shell对当前目录有自己的概念。cd成功,但一旦子shell退出,您就回到交互式shell中,那里没有任何更改 解决此问题的一种方法是使用别名: alias proj="cd

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

#!/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"

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

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


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

当您启动shell脚本时,它会运行该shell的一个新实例(
/bin/bash
)。因此,您的脚本只是启动一个shell,更改目录并退出。换句话说,shell脚本中的
cd
(以及其他类似命令)不会影响或访问启动它们的shell。

它只更改脚本本身的目录,而当前目录保持不变

您可能需要使用一个。它允许您创建文件或目录的“快捷方式”,因此您只需键入类似于
cd my project

的内容即可执行以下操作:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash
nano ~/.config/fish/functions/proj.fish
编辑:这也可以是“虚线”,以防止创建后续壳

例如:

. ./previous_script  (with or without the first line)

杰里米·鲁顿(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

为了快速导航目录,有$CDPATH、cdargs和自动生成别名的方法


您可以将别名和脚本组合在一起

alias proj="cd \`/usr/bin/proj !*\`"
前提是脚本回显目标路径。请注意,这些是围绕脚本名称的反勾号

例如,您的脚本可以是

#!/bin/bash
echo /home/askgelal/projects/java/$1

这种技术的优点是,脚本可以使用任意数量的命令行参数,并发出可能由复杂逻辑计算的不同目的地。

cd在脚本外壳内完成。当脚本结束时,该shell退出,然后您将留在原来的目录中。“源”脚本,不要运行它。而不是:

./myscript.sh

(注意脚本名称前的点和空格。)

要制作将cd刻录到选定目录的bash脚本,请执行以下操作: 创建脚本文件

#!/bin/sh # file : /scripts/cdjava # cd /home/askgelal/projects/java #!/垃圾箱/垃圾箱 #文件:/scripts/cdjava # cd/home/askgelal/projects/java 然后在启动文件中创建别名

#!/bin/sh # file /scripts/mastercode.sh # alias cdjava='. /scripts/cdjava' #!/垃圾箱/垃圾箱 #文件/scripts/mastercode.sh # 别名cdjava='/脚本/cdjava'
  • 我创建了一个启动文件,在其中转储所有别名和自定义函数。
  • 然后我将这个文件源代码放在我的.bashrc中,以便在每次启动时设置它。
例如,创建主别名/函数文件:/scripts/mastercode.sh
(将别名放在此文件中。)

然后在.bashrc文件的末尾:

source/scripts/mastercode.sh


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

我做了以下操作:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash
nano ~/.config/fish/functions/proj.fish
创建一个名为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
分别


在我的例子中,路径要长得多——这些人在前面用~info对其进行了总结。

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

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


您只需输入或将其放入各种shell启动文件中即可。

您可以将Adam&Greg的别名和点方法结合起来,使其更具动态性-

alias project=". project"

现在,运行项目别名将在当前shell(而不是子shell)中执行项目脚本

在我的特殊情况下,我需要太多次才能更改同一目录。 因此,在我的.bashrc(我使用ubuntu)中,我添加了

一,-

$nano~./bashrc

2-

$source~/.bashrc

3-

$switchp java

它将直接执行: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$ 
如果您使用的是shell,最好的解决方案是创建一个函数。例如,给定原始问题,您可以复制下面的4行并将其粘贴到fish命令行中:

function proj
   cd /home/tree/projects/java
end
funcsave proj
这将创建函数并将其保存以供以后使用。如果项目发生更改,只需使用新路径重复该过程

如果愿意,可以通过执行以下操作手动添加函数文件:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash
nano ~/.config/fish/functions/proj.fish
然后输入文本:

function proj
   cd /home/tree/projects/java
end
最后按ctrl+x退出,按y,然后按return保存更改

(注:t
function proj
   cd /home/tree/projects/java
end
move_me() {
    cd ~/path/to/dest
}
move_me 
alias p='. p'
function cdbm() {
  cd whereever_you_want_to_go
  echo "Arguments to the functions were $1, $2, ..."
}
. script_name
source script_name
#!/usr/bin/env bash
cd /home/tree/projects/java
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
exec bash
#!/usr/bin/env bash
cd desired/directory
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
cdproj
cdproj project_name
cdproj(){
    dir=/Users/yourname/projects
    if [ "$1" ]; then
      cd "${dir}/${1}"
    else
      cd "${dir}"
    fi
}
shopt -s cdable_vars
export myjava="/home/tree/projects/java"
cd myjava
cd /home/xxx/yyy && command_you_want
/home/user/.bashrc
/home/user/.bash_profile
/root/.bashrc
/root/.bash_profile
cdd() {
  cd ..
}
ll() {
  ls -l -h
}
lll() {
  ls -l -h -a
}
#!/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:~#
export PWD=the/path/you/want
a alias_name 'set a = `pwd`; set b = `echo $a | replace "Trees" "Tests"` ; cd $b'
a alias_name2 'cd path/you/always/need'