在我的项目中,我们有一个shell脚本,用于设置某些环境变量的默认值。当我尝试运行rinari-console
时,收到错误,因为脚本尚未获取。有没有办法确保rinari来源,所以当rails控制台启动时,所有变量都有所需的值?
答案 0 :(得分:2)
好吧,我对这个问题的思考有点困难。我想出了两个可能的解决方案:
这个解决方案有点笨拙,但应该可行。
您可以创建一个包装器脚本,例如'emacs-wrapper.sh':
#!/bin/sh
set -a
. YOUR-SCRIPT.sh
emacs
如果您启动./emacs-wrapper.sh,则会获取YOUR-SCRIPT.sh并在此之后启动Emacs。 Emacs以这种方式可以看到相同的环境。在我的机器上测试这种方法,我能够(getenv“var”)在YOUR-SCRIPT.sh中定义的所有变量
这是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"))