4

リモートファイルシステムからローカルスクラッチディレクトリにディレクトリをコピーして解凍し、それらを解凍してユーザーがファイルを編集できるようにするための単純な ruby​​ サンドボックスコマンドラインユーティリティを作成しています。Dir.mktmpdir をデフォルトのスクラッチ ディレクトリとして使用していますが、これは非常に見苦しいパスになります (例: /var/folders/zz/zzzivhrRnAmviuee+++1vE+++yo/-Tmp-/d20100311-70034-abz5zj)。

copy-and-unzip スクリプトの最後のアクションで、呼び出し側シェルを新しいスクラッチ ディレクトリに cd して、人々が簡単にアクセスできるようにしたいのですが、呼び出し側シェルの PWD を変更する方法がわかりません。1つの可能性は、ユーティリティにstdoutへの新しいパスを出力させてから、スクリプトをサブシェルの一部として実行させることです(つまりcd $(sandbox my_dir)、)が、最大10分かかる可能性があるため、コピーと解凍の進行状況を出力したいと思います、したがって、これは機能しません。あらかじめ決められた、見つけやすいスクラッチ ディレクトリに移動する必要がありますか? 誰かがより良い提案をしていますか? よろしくお願いします。-エリック

4

4 に答える 4

3

スクラッチディレクトリにある新しいシェルに死ぬ可能性がありますが、これらすべてのポイントを理解するのに苦労しています. ユーザーがこれらのファイルを編集する場合は、それらを保持するか、変更されたファイルで作業することを計画していると思います。最初のケースでは、ファイルを適切な場所 (現在の作業ディレクトリ) に配置しておけば、ユーザーがファイルを見つける心配はありません。2 番目のケースでは、スクラッチ ディレクトリにあるユーザー用のサブシェルを生成し、ファイルを編集するように指示します。サブシェルが終了すると、同じ ruby​​ プログラムから引き続きファイルを処理できます。

于 2010-03-12T01:29:58.313 に答える
1

プロセスはその親プロセスの環境を変更できないため、親で何らかのアクションを実行する必要があります。

ユーザーにシェルスクリプトを入手させ、そのスクリプトがrubyプログラムとcdをどこかで呼び出すようにすることができます。シェルのソースコマンド(.またはsource)を使用すると、現在のプロセスに影響します。

于 2010-03-12T00:56:33.977 に答える
1

glenn jackman が指摘しているように、子プロセスは親の現在の作業ディレクトリ (または環境変数など) を変更できません。デバッガーで親プロセスに違反することをカウントしない限り…</p>

コマンド置換の一部として実行されるプロセスは、stderr に書き込んでユーザーに出力を提供できますが、stdout 出力はコマンド置換によってキャプチャされます。

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でも同等のことができると確信しています。

于 2010-03-12T01:39:16.817 に答える
0

最初にラッピングシェルスクリプトから一時ディレクトリを作成してから、コマンドライン引数としてRubyスクリプトに渡します。

于 2010-03-12T12:10:57.317 に答える