在我的项目中,我们有一个为某些环境变量设置默认值的shell脚本。当我尝试运行rinari-console时,我收到一个错误,因为该脚本尚未获得源代码。有没有办法确保rinari提供它,这样当rails控制台启动时,所有的变量都有所需的值?
发布于 2012-08-07 00:15:44
好吧,关于这个问题,我已经想得更仔细了。我提出了两种可能的解决方案:
通过包装器在外部Emacs
这个解决方案有点笨拙,但它应该是有效的。
你可以创建一个包装器脚本,例如'emacs-wrapper.sh':
#!/bin/sh
set -a
. YOUR-SCRIPT.sh
emacs如果您启动./ Emacs -wrapper.sh,那么您的-SCRIPT.sh将是源文件,然后Emacs将启动。通过这种方式,Emacs也可以看到相同的环境。在我的机器上测试这种方法,我能够(getenv "var")在您的-SCRIPT.sh中定义的所有变量
更好:在Emcas中通过shell-command
这是一个IMO更好的解决方案,因为它完全运行在Emacs中。调用shell-command- to -string来获取您的-SCRIPT.sh。最后,它还会转储该进程的环境。这随后被添加到Emacs自己的process-environment中:
;; 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))))我也在我的机器上验证了这种方法。脚本中定义的所有变量也在Emacs中定义。
发布于 2012-08-07 03:52:17
我设法用包装器做了你想要的事情。假设您在~/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现在,要使用该包装器,请使用前缀参数C-u M-x rinari-mode调用rinari-mode,并在建议的命令末尾添加一个.sh。将设置环境变量TEST。
然后,可以创建一个自动添加.sh的宏。
发布于 2012-08-06 15:52:30
我不使用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
https://stackoverflow.com/questions/11794276
复制相似问题