web-dev-qa-db-ja.com

chdir(<directory>)はシェルを終了した後にディレクトリを変更しません

プロジェクトディレクトリに変更する簡単なCプログラムを作成したかったのです。その内容は次のとおりです。

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

次のコマンド(pro.cはそのファイル名です):

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

エラーも警告もありませんでした。しかし、実行するとnotディレクトリが変更されます。どうして?

8
enedil

あなたのプログラムはあなたが言うように正確に行います:itselfの作業ディレクトリを/home/enedil/projects/algoに変更します。ただし、終了すると、Shellの作業ディレクトリが復元されます。

達成したいことは、単純なcdに頼らずに、親プロセス、つまりシェルの作業ディレクトリを変更することだと思います。 メソッド がありますが、その作者が言うように、しないでください。

15
Kempniu

現在の作業ディレクトリはプロセスに対してローカルです。だから、あなたが望むものは不可能です。

5
vinc17

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に移動できます。

1
BLIELI

シェルでこれを行うには、 source コマンドを使用します(エイリアスは.にエイリアス化されています)。新しいシェルコンテキストを作成するのではなく、現在のシェルのコンテキストでアプリケーションを実行します。これは、環境変数も設定できる方法です。 /etc/rc.dまたは/etc/init.d内のすべての起動スクリプトに気付いた場合は、コマンドを使用して他のスクリプトに含まれている多くのスクリプトが表示されます。

. /etc/init.d/rcvars

.を使用すると、スクリプト/etc/init.d/rcvarsが実行され、変更内容が現在の環境に保持されます。

0
Walter