2010-03-11 102 views
4

我正在編寫一個簡單的紅寶石沙盒命令行實用工具,用於將目錄從遠程文件系統複製和解壓縮到本地暫存目錄,以解壓縮並讓用戶編輯文件。我使用Dir.mktmpdir作爲默認的scratch目錄,這給出了一個非常難看的路徑(例如:/ var/folders/zz/zzzivhrRnAmviuee +++ 1vE +++ yo/-Tmp-/d20100311-70034-abz5zj)從紅寶石腳本更改調用shell的當前工作目錄

我想要copy-and-unzip腳本的最後一個動作,將調用shell轉換到新的scratch目錄,以便人們可以輕鬆訪問它,但我無法弄清楚如何更改PWD調用shell。一種可能性是讓該實用程序打印出stdout的新路徑,然後將該腳本作爲子shell的一部分運行(即cd $(sandbox my_dir)),但我想打印出複製和解壓縮的進度,因爲它可能需要10分鐘,所以這是行不通的。我是否應該將它轉到預先確定的,易於查找的臨時目錄?有沒有人有更好的建議?在此先感謝您的幫助。 -Erik

+0

'$()'沒有使用子shell,它是命令替換。子shell是用裸括號完成的:'(cd/tmp)'(實際上什麼都不做,因爲只有子shell執行chdir,保持原來的shell不變。 – 2010-03-12 01:24:27

+0

參見http://stackoverflow.com/questions/2375003 http://stackoverflow.com/questions/874452 http://stackoverflow.com/questions/2405255和其他... – ephemient 2010-03-12 02:03:37

回答

3

你可能會死在一個新的shell中,它坐落在你的scratch目錄下,但我無法理解所有這一切。如果你的用戶要編輯這些文件,那麼我想他們要麼保留它們,要麼你打算使用修改後的文件。在第一種情況下,將文件放在明智的位置,您不必擔心用戶發現它們(當前工作目錄)。在第二種情況下,爲您的用戶創建一個位於臨時目錄中的子shell並指示他們編輯這些文件。當子shell退出時,您可以繼續處理來自同一個ruby程序的文件。

+0

輸出到cwd並不差,但複製和解壓縮的原因之一是將數據傳輸到延遲更好的本地文件系統,儘管沒有規定說明用戶不能創建自己的暫存目錄。更直觀的解決方案可能是默認到一個已知的暫存目錄(例如/ tmp),並告訴他們看看那裏。我想以正確的方式做(mktmpdir),但我認爲這並不是爲了持續時間長於程序的運行時間(而不是像我需要的時間)。 – 2010-03-12 22:53:35

1

進程無法更改其父進程的環境,因此您必須在父進程中執行一些操作。

你可以讓你的用戶輸入一個shell腳本,該腳本調用ruby程序和cd的某處。當您使用shell的源命令(.source)時,會影響當前進程。

1

由於glenn jackman指出,子進程不能改變其父目前的工作目錄(或環境變量等)。除非你違反了父進程與調試器...

一個進程中運行,一個命令替換的部分可以寫入標準錯誤提供輸出給用戶,而標準輸出輸出由命令替換捕獲:

cd "$(sandbox whatever)" 

其中沙箱命令將其大部分輸出發送到stderr,並且只將最終的「目錄到chdir」發送到stdout。如果沙箱是一個shell腳本,你可以做這樣的:

#!/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來完成。

0

首先從包裝shell腳本創建您的臨時目錄,然後將其作爲命令行參數傳遞給您的Ruby腳本。