退出外壳程序后,chdir(<directory>)不会更改目录


8

我想制作一个简单的C程序来更改我的项目目录。其内容如下:

#include <unistd.h>
int main()
{
    chdir("/home/enedil/projects/algo");
    return 0;
}

我用以下命令编译了它(pro.c是它的文件名):

gcc pro.c -o /usr/local/bin/pro

没有错误也没有警告。但是,当我运行它,它并不会改变目录。为什么?


1
您可以改用别名alias proj='cd ~/enedil/projects/algo'
Michael Durrant 2014年

@MichaelDurrant哦,你是说cd ~/projects/algo什么?这是一个主意!
埃迪尔2014年

1
这是设计使然!
托尔比约恩Ravn的安徒生

Answers:


15

您的程序完全按照您的指示执行操作:将其自身的工作目录更改为/home/enedil/projects/algo。但是,一旦退出,便会还原外壳程序的工作目录。

我想您要实现的是更改父进程的工作目录(即外壳程序),而不求助于simple cd。有一种方法,但正如它的作者所说:不要这样做。


8
Nitpick,但是shell的工作目录未还原,因为它从未更改。就像程序一样,shell只是一个过程。每个程序都有其自己的工作目录。
帕特里克

1
@帕特里克,是的。从概念上讲,更准确的是工作目录还原,因为您的过程已“还原”(在前台处于活动状态)。
Paul Draper 2014年

5

当前工作目录在该进程本地。因此,您想要的是不可能的。


1

您也可以使用CDPATH环境变量。如中所述man bash

   CDPATH The search path for the cd command.  This is  a  colon-separated
          list  of  directories  in  which the shell looks for destination
          directories specified by the cd  command.   A  sample  value  is
          ".:~:/usr".

因此,例如,您可以将此行添加到您的~/.profile

CDPATH=~/projects

现在,您可以cd projects从任何目录运行并转到~/projects


0

为此,请使用source命令(别名为.)。它将在当前外壳的上下文中运行应用程序,而不是创建新的外壳上下文。这也是设置环境变量的方法。如果您发现所有的启动脚本中/etc/rc.d或者/etc/init.d,你会看到很多的脚本由用命令其他脚本包含

. /etc/init.d/rcvars

.导致脚本/etc/init.d/rcvars,以便任何它改变了坚持当前的环境。


1
您不能以这种方式运行C程序,只能运行Shell脚本。
John Kugelman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.