2013-01-18 269 views
0

Ruby似乎使用/bin/sh作爲shell解釋器,它在* nix機器上不理解/bin/bash命令,如pushd。這是irb告訴我:從特定目錄運行shell命令

1.9.3-p327 :011 > `pushd /tmp; echo foo` 
sh: 1: pushd: not found 
=> "foo\n" 

在OSX,/bin/sh是bash的一個別名,所以上面的代碼運行正常那裏。有沒有辦法強制Ruby在* nix機器上使用/bin/bash來解釋shell命令?

回答

4

使用bash命令,如在Ruby中pushd是沒有意義的,因爲這些命令影響bash的內部Bash的解釋的狀態,而當你在Ruby中使用反引號或system運行shell命令,它會創建一個新的子進程,運行命令,然後關閉那個子進程。

這意味着即使你以某種方式管理運行pushd作爲來自Ruby的Bash命令,會發生的事情是Bash子進程將啓動,將目錄推送到目錄堆棧,然後退出。您對目錄堆棧所做的更改將被所有其他子進程的數據擦除 - 並且下一次使用shell命令時,您將不在該目錄中。

您在Ruby中編寫腳本,而不是在Bash中 - 內部Bash命令在這裏沒有任何意義,因此您需要使用Ruby等價物。例如,而不是書寫:

system 'pushd /tmp' 
system 'touch file_in_tmp' 
system 'popd' 

這是行不通的,你想要做的是:

Dir.chdir '/tmp' do 
    system 'touch file_in_tmp' 
end 
+0

腳本運行的方式全部在一行中,就像'pushd/tmp;做一點事;彈出',但你的答案的最後部分似乎好得多無論如何。謝謝。 – cbmanica

0

Dir.chdir("/bin") 

,然後做你的命令:

`pushd /tmp; echo foo` 
+1

你不能'Dir.chdir( '/斌/慶典')' ,因爲'/ bin/bash'不是一個目錄,它是一個可執行文件的名稱。 'chdir('/ bin')'會工作 –

+0

@theTinMan你是對的。謝謝。 – sawa

1

/bin/sh的在紅寶石源是固定的。所以沒有辦法改變默認的shell。您可以使用其他建議方法之一。

+0

嗯,這似乎很不方便,但這樣吧......謝謝。 – cbmanica