2012-08-03 50 views
0

在我的項目中,我們有一個shell腳本爲某些環境變量設置默認值。當我嘗試運行rinari-console時,由於該腳本未找到源,因此收到錯誤消息。有沒有辦法確保rinari能夠獲取它,這樣當rails控制檯啓動時,所有變量都具有所需的值?如何在啓動rinari控制檯之前獲取此shell腳本?

回答

2

好吧,我已經thinkg這個問題有點困難。通過包裝

該解決方案是一個有點笨拙

外Emacs的,但它應該工作:我想到了兩個可能的解決方案。

您可以創建一個包裝腳本,例如'emacs-wrapper.sh':

#!/bin/sh 
set -a 
. YOUR-SCRIPT.sh 
emacs 

如果啓動./emacs-wrapper.sh,YOUR-SCRIPT.sh將採購和Emacs之後開始的。這樣Emacs就可以看到相同的環境。測試我的機器上這種方法,我能夠(getenv的「VAR」)在YOUR-SCRIPT.sh

一些好的定義所有變量:通過shell命令在E​​mcas

這是IMO更加美好因爲它完全在Emacs內部運行。打電話給shell-command-to-string來源你的YOURSCRIPT.sh。最後它還會轉儲過程的環境。隨後將其添加到Emacs自己的過程環境中:

;; defadvice is optional, you could also just call source-script directly 
(defadvice rinari-console (before init-environment activate) 
    (source-script "/PATH/TO/YOUR-SCRIPT.sh")) 

(defun source-script (script) 
    (let ((env (extract-environment script))) 
     (mapc 'import-environment-variable (split-string env "\n")))) 

(defun extract-environment (script) 
    (shell-command-to-string (format "set -a; . %s > /dev/null 2>&1; env" script))) 

(defun import-environment-variable (variable-assignment) 
    (when (not (or (null variable-assignment) (string= "" variable-assignment))) 
     (let* ((key-value-pair (split-string variable-assignment "=")) 
      (key (car key-value-pair)) 
      (value (cadr key-value-pair))) 
     (setenv key value)))) 

我在我的機器上也驗證了這種方法。所有在YOUR-SCRIPT中定義的變量也在Emacs中定義。

+0

你的方法很棒!謝謝! – Geo 2012-08-08 20:46:40

-1

我不使用rinari所以有可能是更好的方式來做到這一點,但在原則上,你可以做到這一點運行實際rinari控制檯命令之前運行「YOUR-SCRIPT.sh」。

(defadvice rinari-console (before run-my-script activate) 
    (shell-command "YOUR-SCRIPT.sh")) 

參見:http://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Functions.html

+0

我試過了你的答案,但它並不是源'YOUR_SCRIPT.sh',所以當rinari控制檯啓動時,它沒有這些值。 – Geo 2012-08-06 08:00:30

+0

啊,你想源腳本,而不是運行它。我沒有注意到你在問題中提到過它。可能最好改變標題呢? – tkf 2012-08-06 09:05:07

+0

我已經改變了它,抱歉的混亂。 – Geo 2012-08-06 09:07:34

-1

那麼,如果你想源腳本,你應該能夠做的非常相似,TKF建議的東西:

(defadvice rinari-console (before run-my-script activate) 
    (shell-command ". YOUR-SCRIPT.sh")) 
+1

這不能解決基本問題。 shell命令在與Rinari控制檯不同的進程中運行。 – tripleee 2012-08-06 10:05:06

+0

是的,你是對的。我沒在想 – djf 2012-08-06 10:26:02

1

我能夠做到你想要用的包裝是什麼。 假設您在~/test中創建了一個rails項目。 Rinari將通過執行命令~/test/script/console嘗試啓動irb。 我創建了一個名爲~/test/script/console.sh包裝:

#!/bin/sh 

. ~/test/script/env.sh 
~/test/script/console 

包含環境變量,然後你的腳本包裝源執行常規命令。

文件~/test/script/env.sh包含:

export TEST=test 

我們使用的包裝,調用rinari-mode用一個前綴參數C-u M-x rinari-mode並添加.sh所提出的命令結束。環境變量TEST將被設置。

然後,您可以創建一個自動添加.sh的宏。

+0

由於某種原因,這個解決方案會導致我的Ubuntu凍結:) – Geo 2012-08-07 06:30:37

+0

以我給出的例子或與您的腳本。如果是腳本,請將其複製到某個地方以查看發生了什麼。 – 2012-08-07 11:56:19