Ruby スクリプトから呼び出しシェルの現在の作業ディレクトリを変更する
質問
私は、リモート ファイルシステムからローカルのスクラッチ ディレクトリにディレクトリをコピーして解凍し、ユーザーがファイルを編集できるようにする、単純な Ruby サンドボックス コマンドライン ユーティリティを作成しています。私は Dir.mktmpdir をデフォルトのスクラッチ ディレクトリとして使用していますが、非常に醜いパスが与えられます (例:/var/folders/zz/zzivhrRnAmviuee+++1vE+++yo/-Tmp-/d20100311-70034-abz5zj)
コピーと解凍スクリプトの最後のアクションで、呼び出しシェルを新しいスクラッチ ディレクトリに cd して、ユーザーが簡単にアクセスできるようにしたいのですが、呼び出しシェルの PWD を変更する方法がわかりません。1 つの可能性は、ユーティリティに新しいパスを stdout に出力させてから、サブシェルの一部としてスクリプトを実行することです (つまり、 cd $(sandbox my_dir)
)ですが、コピーと解凍の進行状況を出力したいのですが、これには最大 10 分かかるため、これは機能しません。あらかじめ決められた、見つけやすいスクラッチ ディレクトリに保存するだけでよいでしょうか?誰かもっと良い提案がありますか?よろしくお願いいたします。-エリック
解決
スクラッチ ディレクトリにある新しいシェルに移行することもできますが、私はこのすべての要点を理解するのに苦労しています。ユーザーがこれらのファイルを編集しようとしている場合は、それらを保持したいか、または変更されたファイルを使用して作業することを計画していると思います。前者の場合、ファイルを適切な場所 (現在の作業ディレクトリ) に置くと、ユーザーがファイルを見つけることを心配する必要がなくなります。2 番目のケースでは、スクラッチ ディレクトリにあるユーザー用のサブシェルを生成し、ファイルを編集するようにユーザーに指示します。サブシェルが終了すると、同じ Ruby プログラムからファイルの処理を続行できます。
他のヒント
プロセスは親プロセスの環境を変更できないため、親プロセスで何らかのアクションを実行する必要があります。
ユーザーにシェル スクリプトをソースしてもらい、そのスクリプトが Ruby プログラムと CD をどこかに呼び出すことができます。シェルのソース コマンド (.
または source
)、現在のプロセスに影響します。
glenn jackman 氏が指摘しているように、子プロセスは親の現在の作業ディレクトリ (または環境変数など) を変更できません。デバッガで親プロセスへの違反をカウントしない限り…
コマンド置換の一部として実行されるプロセスは、コマンド置換によって stdout 出力がキャプチャされている間に、stderr に書き込んで出力をユーザーに提供できます。
cd "$(sandbox whatever)"
どこ サンドボックス このコマンドは、出力の大部分を stderr に送信し、最後の「chdir へのディレクトリ」だけを stdout に送信します。もし サンドボックス シェルスクリプトだった場合は、次のように実行できます。
#!/bin/sh
newdir="$(mktemp -dt sandobox)"
{
# do whatever, in a sub-shell
# use a group command (or change the braces to parens to use a sub-shell) to
# capture all stdout and send it to stderr
} 1>&2
echo "$newdir"
Rubyでも同等のことができると確信しています。
まずラッピング シェル スクリプトから一時ディレクトリを作成し、それをコマンド ライン引数として Ruby スクリプトに渡します。