Emacs shell命令未找到。

6

我使用的是Mac OS X 10.5.8系统,正在学习emacs。我对它非常陌生,今天尝试在emacs中输入shell命令。我输入了pdflatex filename,但是它给了我一个错误提示。

/bin/bash: pdflatex: command not found

我已经安装了LaTeX,并且在终端命令行中,pdflatex可以正常使用。
对于我在.bash_profile文件中定义的lsd命令,我也在终端命令行中成功执行了。但是在emacs shell中,我遇到了类似的错误。
请问有人知道可能出现了什么问题吗?
我该如何让emacs识别所有在终端命令行中可以正常使用的命令?
是否有办法使emacs shell和终端命令行使用相同的环境?如果可以,您是否建议这样做?我对bash和emacs都了解甚少。
3个回答

8

可能 Emacs shell 正在与您在终端命令行上拥有的不同环境中运行。比较在 Emacs shell 和终端中运行时 env 的输出。特别注意 PATH 值。


谢谢!你说得对,Emacs shell有一个不同的环境。我使用M-x setenv更改了emacs shell的PATH。这样pdflatex就可以在emacs shell中工作了。然而,我在.bash_profile中定义的lsd命令不起作用。有没有办法让环境完全相同? - Curious2learn
1
.bash_profile 只会在您的登录 shell 中加载。如果您想自定义常规 shell(例如 xterm 窗口或 Emacs shell),则需要将自定义内容放在 .bashrc 中。许多人会从 .bash_profile 引用 .bashrc,这样您就可以在登录 shell 中获得所有自定义内容,但在常规 shell 中只能获得 .bashrc 中的内容。 - Tyler
奇怪。每次我启动emacs shell时,.bashrc都会自动加载。也许尝试一些调试行-在.bashrc中添加:echo“bashrc已加载”,在.bash_profile中添加:echo“bashprofile已加载”,然后在emacs中调用一个新的shell:M-x shell。如果您看到其中一个或两个回显行,您将知道每次打开新shell时emacs正在读取什么。 - Tyler
如果您正在使用 M-x shell,则可以在 ~/.emacs_SHELLNAME~/.emacs.d/init_SHELLNAME.sh 中为 SHELLNAME(例如“bash”)提供特定于emacs的初始化(请参见 C-h f shell)。一些替代 M-x shell 的方法是 M-x term(或 M-x ansi-term)和 M-x eshell - phils
11
Emacs的shell命令(M-!)默认不是交互式的,因此bash不会加载您的.bashrc文件。 您可以通过在您的.emacs初始化文件中添加(setq shell-command-switch "-ic")来更改这个设置。 -i选项告诉bash要交互式地运行,从而使它能够加载/.bashrc文件。 这是一个简单的解决方法,但在运行快速shell命令时,您的/.bashrc文件中可能存在一些您不需要的内容。 在这种情况下,最好设置BASH_ENV环境变量,以便您可以更精细地控制发生的事情。 - miner49r
显示剩余2条评论

1

来自shell命令的帮助:

使用的程序来自变量“explicit-shell-file-name”, 或者(如果该变量为nil)来自ESHELL环境变量, 或者(如果该变量为nil)来自“shell-file-name”。 如果存在文件“~/.emacs_SHELLNAME”或“~/.emacs.d/init_SHELLNAME.sh”, 则将其作为初始输入(但由于时序错误,当shell启动时,这可能会丢失)。 缓冲区被放置在Shell模式下,提供发送输入和控制shell子任务的命令。参见“shell-mode”。 另请参阅变量“shell-prompt-pattern”。

因此,您可以创建符号链接~/.emacs_bash(用于bash)或~/.emacs_zsh(用于zsh)。或者将变量explicit-shell-file-name设置为指向~/.bash_profile~/.bashrc~/.zshrc中的任何一个,取决于您使用的是哪个,或者您还可以玩一下ESHELL环境变量。


在我的macOS上的spacemacs中,我需要为bash shell设置ANDROID_SDK_ROOT。正如Adam所提到的,我创建了/.emacs_bash文件并添加了“export ANDROID_SDK_ROOT=/Library/Android/sdk”。它起作用了! - winner.ktw

0
根据以下文章。如果您从shell启动emacs,它将继承shell的环境变量。因此,只需从您最熟悉的shell启动emacs即可自动设置环境变量。例如:
cd /file_path
emacs file_name

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