Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我运行shell命令时,有没有办法让emacs识别bash别名和自定义函数?_Bash_Shell_Emacs_Environment Variables - Fatal编程技术网

当我运行shell命令时,有没有办法让emacs识别bash别名和自定义函数?

当我运行shell命令时,有没有办法让emacs识别bash别名和自定义函数?,bash,shell,emacs,environment-variables,Bash,Shell,Emacs,Environment Variables,在我的shell环境中,我有别名和自定义函数。当我在emacs实例中(我总是使用emacs-nw)并且执行shell命令(M-!)时,我无法使用它们。这是有道理的,因为我想象它会启动自己的子shell来做这些。。。但是有没有办法(也许在我的.emacs中)让它起作用呢?也许即使在执行任何给定的shell命令之前,默认情况下需要寻找一个环境?将别名和函数放在.bashrc中,而不是.bash\u profile中。后者仅在登录shell中执行,前者在所有shell中执行。请通读 对于非交互式she

在我的shell环境中,我有别名和自定义函数。当我在emacs实例中(我总是使用
emacs-nw
)并且执行shell命令(
M-!
)时,我无法使用它们。这是有道理的,因为我想象它会启动自己的子shell来做这些。。。但是有没有办法(也许在我的
.emacs
中)让它起作用呢?也许即使在执行任何给定的shell命令之前,默认情况下需要寻找一个环境?

将别名和函数放在
.bashrc
中,而不是
.bash\u profile
中。后者仅在登录shell中执行,前者在所有shell中执行。

请通读


对于非交互式shell,唯一来源的文件是BASH_ENV环境变量的值。如果emacs将使用BASH来执行shell命令,则调用emacs,比如
BASH\u ENV=~/.bashrc emacs
——有些程序专门使用“/bin/sh”

,下面是我对我认为相关问题的评论:

我认为M-xshell命令和M-x compile命令都是通过调用过程在低级shell中执行命令的。在.emacs中尝试以下操作(或仅评估):

(setq shell文件名“bash”)
(setq外壳命令开关“-ic”)
我注意到,在对上述内容求值之后,.bashrc别名将被M-xshell命令和M-xcompile使用,即

M-x编译RET您的\u别名RET

那就行了

我的环境:Emacs 24.1(预测试rc1),OSX 10.7.3


要使
shell命令
在按照中所述的技术执行命令之前读取
~/.bashrc
,并且由于为整个Emacs会话定义了
$BASH_ENV
而不会产生潜在的副作用,请在
~/.Emacs.d/init.el
(或
.Emacs
)文件中尝试以下操作:

如第二行中的注释所述,还要安装(在
$PATH
中)一个名为
bash for emacs.sh
的脚本,该脚本包含:

#!/bin/bash

BASH_ENV="~/.bashrc" exec bash "$@"
请注意,您的
~/.bashrc
可能需要更改以定义非交互式别名,即使
[-z“$PS1”]
为true(表示非交互式shell)。这就是我为自己的环境(比如现在的环境)所采取的方法,这是在


此外,这假设您想像我一样使用Bash作为Emacs派生的shell。

我们需要在非交互式shell中启用别名扩展,最好仅在从Emacs调用别名时启用(以避免在运行其他shell时造成细微差异)。对我有效的方法是创建两个文件:~/.alias拥有我所有的别名,例如

alias python python27
和~/

source ~/.alias
shopt -s expand_aliases
当然,我还将.bashrc中的所有别名替换为

source ~/.alias
最后,我在.emacs中添加了以下内容:

(setenv "BASH_ENV" "~/.aliasExpand")
我尝试了基思·弗劳尔(Keith Flower)的解决方案(让贝壳互动),我得到了

bash:无法设置终端进程组(-1):设备的ioctl不正确 bash:此shell中没有作业控制

注意,我是通过格伦·杰克曼和尼古拉斯·杜德布特的暗示得到的

如果您愿意冒险让所有shell都具有别名扩展,并且不介意为每个emacs shell运行所有.bashrc,那么您可以将此简化为添加别名扩展

shopt -s expand_aliases
给你的.bashrc和

(setenv "BASH_ENV" "~/.bashrc")

对于以非登录模式启动的.emacs

,您必须找到在何处更改要运行的命令以启动shell并添加
-l
。我使用vim,所以我不确定emacs将其隐藏在哪里。问题不是登录,而是交互。execute子命令shell是非交互式的(如运行
M-x!tty-s
所示,它给出了一个1的代码)。我也有这个问题。然而,由于
M-&
及其在Dired中的对应项的特殊性,我只是放弃了,将我的别名改为
.zshenv
。bashrc源代码用于交互式shell,而不是所有shell:@Barmar,将别名放在
中。bashrc
不会改变任何事情。您似乎还必须使用
shopt-s expand\u alias
启用别名机制。默认情况下,在非交互式shell中不启用此功能。此功能运行良好!谢谢,“-ic”部分做什么?它是用于交互的吗?@PalaceChan:
-i
是用于交互的,
-c
告诉bash读取后面的任何命令(所以无论Emacs在它的shell调用中使用什么)。@PalaceChan给出了下一个问题(),该问题问你为什么会出现一个错误,它是如何出色地工作的?(Terminator中的Emacs 24.4.1)这对我来说非常有效,但在输出之前我会收到消息:bash:无法设置终端进程组(-1):设备的ioctl不合适bash:此外壳中没有作业控制这不起作用-我正在运行emacs 26.1,bash 4.4谢谢答案。顺便说一句,我认为您可以只使用
(setenv“BASH_ENV”(扩展文件名“~/.bashrc”)
(setenv“BASH_ENV”(替换为文件名“$HOME/.bashrc”)
,这样就不需要
shopt
(setenv "BASH_ENV" "~/.bashrc")