Rubyでプログラム実行後のディレクトリを変更する方法.


前書き

日本語のサイトでは方法を見つけることができなかったので,今回は海外のサイトを参考にしました.詳しい動作部分については理解しきれていないので詳しい方がいればコメントしていただきたいです

*本記事はMacユーザが書いています.

やりたい事

Rubyで書いたプログラムを実行した後に実行前と実行後でディレクトリを移動している状態にしたいです.以下の例ではchdir_test.rbが目的のファイルです.

$ ~; pwd
~
$ ~; ruby chdir_test.rb
$ ~/test; pwd
~/test

試した事

  1. プログラム内でシェルスクリプトを実行してみれば良いんじゃないの?
  2. プログラム内でosascriptを実行したら良いんじゃないの?

どちらも上手くいかない...
以下はその詳細です.

< 1 >
シェルスクリプトでなら期待される振る舞いをしてくれますが,それをRubyのプログラム内で行うと期待外れの結果に終わった.

sample.sh
#!/bin/sh
cd ~/test
chdir_test.rb
system(". chdir_workshop.sh") #もしくは.ではなくsourceでも同じ

これだと実行前のディレクトリと実行後のディレクトリは同じでした.

< 2 >
osascriptとはAppleScriptを実行するためのコマンドです.例えば音を再生したりターミナルを新規で立ち上げるときに使っています.

しかしこれについて,僕は全く詳しくありません.なんとか辿り着いた方法としてターミナルを新規に立ち上げてディレクトリを移動することはできました.

chdir_test.rb
system("osascript -e 'tell application \"Terminal\" to do script \"cd test \" '")

するとこんな感じで新規にターミナルが立ち上がり,指定のディレクトリに行ってくれます.
しかし今回の目的はターミナルの新規立ち上げはして欲しくありません.

上手く行った方法

結果からかくと以下のコードで期待される振る舞いの実現ができました.

chdir_test.rb
Dir.chdir 'test'
exec 'fish' #僕はシェルでfishを使っているので,bashの人はbashに変えてください.

要はプログラム内で起こった変化のまま新規シェルの立ち上げることで,新しいシェルではディレクトリの移動が完了していることになってるのかな?(この辺を詳しく理解できていません

最後に

冒頭にも記載させていただいていますが,この記事の作者である僕自身の理解が浅いため良い記事ではありません.ご協力いただける方は,ご指摘お願いいたします.