.bashrc:如何检查shell运行的终端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.bashrc:如何检查shell运行的终端相关的知识,希望对你有一定的参考价值。

我的.bashrc中有以下内容:

bind '"e[A"':history-search-backward
bind '"e[B"':history-search-forward

但是,当我从Emacs中调用shell时,我收到以下消息:

bash:bind:warning:未启用行编辑

bash:bind:warning:未启用行编辑

结果我的提示搞砸了。

我如何检测(从我的.bashrc中),我的shell是从emacs调用的,或者是不是从标准终端调用?

我的目标是将调用包装到bind,以便它们只在适当的终端中执行。

答案

在Emacs 25和bash 4.2下,探测一个名为EMACS的变量对我不起作用。

但是,在Emacs内外寻找shell环境的差异时,我发现了一个名为INSIDE_EMACS的变量,只有在从Emacs运行时才会设置。

因此,对我有用的解决方案是:

if [[ ! -v INSIDE_EMACS ]]; then
    bind '"e[A"':history-search-backward
    bind '"e[B"':history-search-forward
fi

回应INSIDE_EMACS返回Emacs版本号。

另一答案

bash禁用行编辑,因为它在其环境中看到名为EMACS的变量。您可以使用相同的变量来有条件地创建这些绑定:

if [[ ! -v EMACS ]]; then
    bind '"e[A"':history-search-backward
    bind '"e[B"':history-search-forward
fi
另一答案

此代码段专门测试是否在bash中启用了行编辑。它适用于所有地方,而不仅仅是在emacs shell中:

if [[ "$(set -o | grep 'emacs|vi' | cut -f2 | tr '
' ':')" != 'off:off:' ]]; then
  echo "line editing is on"
fi

它可能会简化......

以上是关于.bashrc:如何检查shell运行的终端的主要内容,如果未能解决你的问题,请参考以下文章

打开终端并运行 shell 脚本(CentOS)后出现 Bash 错误 [重复]

检查命令是不是在 bashrc 中运行

Shell配置不运行sed命令

Linux之.bashrc 文件

自定义shell终端提示符及颜色 (以Centos为例)

Mac 终端 进程已完成 怎么解决