如何在启动rinari控制台之前获取此shell脚本?

时间:2012-08-03 10:51:47

标签: ruby-on-rails emacs rinari

在我的项目中,我们有一个shell脚本,用于设置某些环境变量的默认值。当我尝试运行rinari-console时,收到错误,因为脚本尚未获取。有没有办法确保rinari来源,所以当rails控制台启动时,所有变量都有所需的值?

4 个答案:

答案 0 :(得分:2)

好吧,我对这个问题的思考有点困难。我想出了两个可能的解决方案:

外部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中定义的所有变量

Nicer:通过shell-command

在Emcas中

这是IMO一个更好的解决方案,因为它完全在Emacs中运行。调用shell-command-to-string来获取YOUR-SCRIPT.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中定义。

答案 1 :(得分:1)

我设法用包装器做你想做的事。 假设您在~/test中创建了一个rails项目。 Rinari将尝试通过执行命令irb来启动~/test/script/console。 我创建了一个名为~/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的宏。

答案 2 :(得分:-1)

我不使用rinari所以可以有更好的方法来做,但原则上你可以在运行实际的rinari-console命令之前运行“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

答案 3 :(得分:-1)

如果你想要编写脚本,你是否应该做一些与tkf建议非常类似的事情:

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