找不到 Emacs shell 命令

Posted

技术标签:

【中文标题】找不到 Emacs shell 命令【英文标题】:Emacs shell command not found 【发布时间】:2011-05-22 13:45:11 【问题描述】:

我在 Mac OS X 10.5.8 上工作。我正在努力学习emacs。我对它很陌生,今天尝试从 emacs 中输入 shell 命令。我输入了pdflatex filename。但是,它给了我一个错误提示

/bin/bash: pdflatex: command not found

我已经安装了 LaTeX,并且 pdflatex 在终端的命令行中可以正常工作。

我在.bash_profile 文件中定义的命令lsd 出现类似错误。这在终端的命令行上也可以正常工作。

ls 命令在 emacs shell 中运行良好。

有没有人知道可能发生的事情。

如何让 emacs 识别在终端命令行上正常工作的所有命令。 无论如何我可以使emacs shell和终端命令行使用的环境相同吗? 如果是这样,您有什么理由不建议这样做吗?我对 bash 和 emacs 都知之甚少。

非常感谢。

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢!你是对的; Emacs shell 具有不同的环境。我使用M-x setenv 更改了emacs shell 的PATH。使用该 pdflatex 在 emacs shell 中工作。但是,我在 .bash_profile 中定义的命令 lsd 不起作用。有什么办法可以使环境相同。 .bash_profile 仅为您的登录 shell 加载。如果要自定义常规 shell(例如 xterm windows 或 Emacs shell),则需要将自定义放在 .bashrc 中。很多人会从 .bash_profile 获取 .bashrc,这样您就可以在登录 shell 中获得所有自定义项,但只能在常规 shell 中获得 .bashrc 中的自定义项。 @Tyler - 感谢您的回复。我打开了 .bash_profile 文件并将其保存为 .bashrc 文件。但是,lsd 命令仍然不起作用。 奇怪。每次我启动 emacs shell 时,都会自动为我加载 .bashrc。也许尝试一些调试行 - 在.bashrc中,添加:echo“bashrc加载”,在.bash_profile中,添加:echo“bashprofile加载”,然后在emacs中调用一个新的shell:M-x shell。如果您看到一条或两条 echo 行,您就会知道每次打开新 shell 时 emacs 正在读取什么。 Emacs shell 命令 (M-!) 默认情况下不是交互式的,因此 bash 不会加载您的 .bashrc。您可以通过将 (setq shell-command-switch "-ic") 添加到您的 .emacs 初始化文件来更改此设置。 -i 告诉 bash 是交互式的,这使它加载 ~/.bashrc 文件。这是一种简单的解决方法,但是在运行快速 shell 命令时,您的 ~/.bashrc 中可能存在您不一定想要的东西。在这种情况下,最好设置 BASH_ENV 环境变量,以便更好地控制发生的情况。【参考方案2】:

来自shell 命令的帮助:

使用的程序来自变量“explicit-shell-file-name”, 或(如果为 nil)来自 ESHELL 环境变量, 或(如果为 nil)来自“shell-file-name”。 如果文件‘~/.emacs_SHELLNAME’存在,或者‘~/.emacs.d/init_SHELLNAME.sh’, 它作为初始输入给出(但这可能会丢失,由于时间 错误,如果 shell 在启动时丢弃输入)。 缓冲区被置于 Shell 模式,给出发送输入的命令 并控制外壳的子作业。请参阅“外壳模式”。 另请参阅变量“shell-prompt-pattern”。

所以你可以只创建符号链接~/.emacs_bash(用于 bash)或~/.emacs_zsh(用于 zsh)。或者将变量explicit-shell-file-name 设置为指向~/.bash_profile~/.bashrc~/.zshrc,无论您使用哪个,或者您也可以播放哪个ESHELL 环境变量。

【讨论】:

在我的 spacemacs(macOS 上)上,我需要为 bash shell 设置 android_SDK_ROOT。正如亚当所说,我创建了 ~/.emacs_bash 文件并添加了“export ANDROID_SDK_ROOT=~/Library/Android/sdk”。它有效!【参考方案3】:

根据以下article。如果从 shell 启动 emacs,它将继承 shell 的环境变量。因此,只需从您最熟悉的任何 shell 启动 emacs 即可自动设置环境变量。例如:

cd /file_path
emacs file_name

【讨论】:

以上是关于找不到 Emacs shell 命令的主要内容,如果未能解决你的问题,请参考以下文章

如果我找不到我的 emacs 初始化文件怎么办?

emacs 为什么找不到运行程序?

在 sh shell 中找不到源命令

为啥 emacs-lsp go-mode 在路径中找不到 go 可执行文件?

ubuntu 20.04 上的 Emacs 27.1 找不到任何字体

对于回显到 telnet 命令的数据,shell 说“找不到命令”错误