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

@MichaelDurrantああ、そうcd ~/projects/algoですか?アイデアです!
エンディル2014

1
これは仕様によるものです。
するThorbjörnRavnアンデルセン

回答:


15

プログラムは、ユーザーが指示したとおりに実行します。プログラム自体の作業ディレクトリをに変更し/home/enedil/projects/algoます。ただし、いったん終了すると、シェルの作業ディレクトリが復元されます。

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


8
Nitpick。ただし、シェルの作業ディレクトリは変更されていないため、復元されません。シェルは、プログラムと同じように、単なるプロセスです。各プログラムには、独自の作業ディレクトリがあります。
Patrick 14

1
@パトリック、本当。概念的には、プロセスが「復元」される(フォアグラウンドでアクティブになる)ことで作業ディレクトリが復元されます。
Paul Draper 14

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".

したがって、たとえば、次の行をyourに追加できます~/.profile

CDPATH=~/projects

これでcd projects、任意のディレクトリから実行してに移動でき~/projectsます。


0

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

. /etc/init.d/rcvars

これ.により、スクリプトは/etc/init.d/rcvars変更されたものが現在の環境に保持されます。


1
この方法ではCプログラムを実行できません。シェルスクリプトのみです。
John Kugelman、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.