日期:2014-05-16 浏览次数:21176 次
sh -c "cd /home; ls"
------解决方案--------------------
sh -c cd /home
这样是不行的,这样会启动一个新的shell执行那个cd操作,执行完成之后,shell就结束了,不会影响当前shell
------解决方案--------------------
这肯定不行啊,你要知道你直接调用脚本执行是要创建子进程的,这样cd 是在子进程的改变,所以调用结束后返回父进程所以ls 的当前目录是父进程的当前目录,也就是你说的看到的还是当前目录下的ls后的效果。你可以用pwd在脚本中测试一下的。直接用shell程序执行和给一个文件+x 然后执行原理是一样的,都要创建子进程
但是source 和前两种不一样。他不会创建子进程,所以你可以得到你想要的结果。
下面以一个简单的shell 说明他们的一点区别
#! /bin/bash
cd /tmp # 当前目录不再这里;
echo "hello world";
第一种执行方式
zhanghong@ubuntu:~/shell$ ./echo.sh
hello world
zhanghong@ubuntu:~/shell$ pwd
/home/zhanghong/shell
第二种
zhanghong@ubuntu:~/shell$ bash ./echo.sh
hello world
zhanghong@ubuntu:~/shell$ pwd
/home/zhanghong/shell
第3中种
zhanghong@ubuntu:~/shell$ source ./echo.sh
hello world
zhanghong@ubuntu:/tmp$ pwd
/tmp