Coding Agent と作業ディレクトリ迷子問題を避ける
Coding Agent と作業ディレクトリ迷子問題を避ける
課題:作業ディレクトリがずれてしまう
Claude Code のような Coding Agent を使っていると、「今どのディレクトリで処理をしているのか」がずれてしまうことがあります。特にプロジェクトの階層が深い場合は、意図した場所でプログラムを動かせずに失敗することがよくあります。
エージェントはよく cd foo/bar && ../../tool
のように、移動してから実行する形を出力します。この方法は一度だけなら問題ありませんが、セッション全体の作業ディレクトリが変更されたまま残ってしまい、次のコマンドで混乱を招くのが悩ましいところです。
方法:環境変数で実行する場所を指定する
そこで私は「作業ディレクトリを移動しない」方法をとるようにしました。具体的には、実行する場所を環境変数で指定し、プログラム側でその場所を参照して動作するようにします。
例えば次のように書きます。
TARGET_DIR=foo/bar ./tool run
このようにすると、プログラムは指定された場所で動作しますが、起動は常にプロジェクトの一番上の階層から行えます。つまり、セッション全体の作業ディレクトリを変える必要がなくなります。
結果:安定した実行ができる
この方法を使うことで、毎回「いまどの場所にいるのか」を気にせずに済むようになりました。さらに「環境変数を先頭に置く」という形は Coding Agent が繰り返し守りやすく、一度この形式を定着させると省略されにくくなります。そのため実行結果が安定し、誤動作も大幅に減りました。
もちろん、サブシェル括弧 ( cd foo/bar && ../../tool )
を使う方法もあります。これは親の作業ディレクトリを汚さないので理屈としては正しいやり方です。実際に試してみると確かに動作しますが、毎回その形を守らせるのは難しく、エージェントが括弧を省略して単独の cd
を出力してしまうこともあります。また「どんな場合にサブシェルを使うべきか、逆に不要なのか」の判断が意外と非自明で、安定した運用には向きませんでした。
そう考えると、環境変数で「前に必ず付ける」形を正解フォーマットにしてしまうのが一番安定です。作業ディレクトリの移動を避けつつ、エージェントや人間の習慣としても定着させやすいからです。
ちなみに調べてみると、既存のコマンドには -C
という「指定したディレクトリで実行する」オプションを持つものがけっこうあります。私は最近まで知りませんでしたが、そうした慣習があると考えると、環境変数や -C
で場所を明示するのは自然な設計だと感じます。
まとめ
-
ディレクトリを移動して実行すると、後続の処理で混乱が起きやすい。
-
サブシェル括弧で回避はできるが、安定させるのが難しく、使う場面の判断も非自明。
-
環境変数で実行場所を指定する方式なら、常に同じ形で動かせる。
-
特に先頭に環境変数を置く形式は Claude Code のような Coding Agent にも守られやすく、再現性が高い。
私はこの方法を標準のやり方にしてから、作業ディレクトリを意識せずに済み、Coding Agent とのやり取りもかなり快適になりました。
Discussion