others - linux - 在shell script中,"cd"为什么不工作?

我试图编写一个小脚本来将当前目录更改为我的项目目录:


#!/bin/bash


cd /home/tree/projects/java



我将这个文件保存为proj,添加了chmod的execute权限,并且将它复制到/usr/bin,当我调用它的时候: proj,它什么也不做,我哪儿错了?

时间:

shell脚本在子shell内运行,每个子shell都有自己的当前目录的概念,当子shell退出时,cd将成功,你将返回交互式shell,并且且没有改变。

解决这个问题的一种方法是使用别名:


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



你没有做错,你已经改变了目录,但是只在运行脚本的子shell中改变,

你可以使用"圆点"命令在当前进程中运行脚本:

 
. proj



 

脚本中的cd工作,因为它更改了运行脚本的shell目录,但是这是一个单独的进程。

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


jhome () {


 cd /home/tree/projects/java


}



你可以输入或者把它放在一个shell启动文件中。

cd是在脚本的shell中完成的,脚本结束后,shell退出,然后你就离开了你所在的目录,替代:

 
./myscript.sh



 

 
. ./myscript.sh



 

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

你可以使用.在当前的shell环境中执行脚本:

 
. script_name



 

或者用shell特定的别名source :

 
source script_name



 

这样可以避免子shell,并允许变量或内置的(包括cd )影响当前的shell 。

...