如何告诉shell它是从Emacs中运行的?

5
我有一个程序,它使用ansi终端代码来做一些花哨的事情,比如在终端中运行时擦除行。当在Emacs中运行时,显然会破坏缓冲区。该程序有一个选项可以选择不使用这些功能,因此我希望能够在Emacs中的shell中运行时打开该选项。
我将该程序作为Makefile的一部分执行,无论是从终端还是从Emacs的compile-mode中执行。因此,有没有办法让compile-mode设置一个环境变量(或类似的东西),以便在需要时很容易捕获并在Makefile中使用该选项?
手动在make-command中添加额外的参数(无论是哪种情况)是我要避免的。
2个回答

7

Emacs还将设置$ INSIDE_EMACS环境变量。如果您不仅需要知道是否在emacs内运行shell会话,而且需要知道使用的emacs版本以及如何运行shell会话(如果您在脚本中使用ansi控制字符,则这很有用),则此功能对您很有用。当我在Emacs中的bash shell中(使用'shell')时,我得到以下内容:

~ $ echo $INSIDE_EMACS
24.0.50.3,comint
~ $ 

如果我在Emacs的Bourne shell中(使用“ansi-term”)执行相同的操作,则结果如下:

sh-3.2$ echo $INSIDE_EMACS
24.0.50.3,term:0.96
sh-3.2$ 

以下是我在终端(而不是Emacs中)运行同样命令时得到的结果:
~ $ echo $INSIDE_EMACS

~ $ 

我在我的XEmacs中没有看到那个。 - beluchin

4

M-x shell会话中,EMACS会设置$EMACS环境变量,因此您只需要检查该变量(假设您没有在shell脚本的其他地方意外定义EMACS):

# from login shell
echo $EMACS

# within Emacs shell
bash-4.2$ echo $EMACS
t

完美!这正是我所期望的,但是很难找到。 - thoni56
3
我曾经通过查看在emacs下运行的shell的env命令的输出结果来理解这个问题。 - sanityinc
2
Foo Bah:你说“eshell”,但我认为你不是真的这么想?尝试使用M-x eshell实验,不会设置EMACS环境变量,而且您也看不到带有eshell的“bash” shell提示符。然而,对于从Emacs启动的其他shell(例如 M-x shellM-x termansi-term),该环境变量似乎确实存在。 - phils
2
顺便提一下:我注意到如果我在emacs的M-x term模式中生成一个不同的终端程序(比如xterm),那么新的xterm会话中仍然保留$EMACS和$INSIDE_EMACS。没有其他环境变量似乎会传递到新的xterm会话中。这看起来很奇怪。 - bengineerd
2
根据http://www.gnu.org/software/emacs/manual/html_node/emacs/Interactive-Shell.html文档,`EMACS`变量被弃用了,“使用该变量的程序应转而使用`INSIDE_EMACS`”。 - oyouareatubeo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接