inputrc 中的 if 语句

inputrc 中的 if 语句

我正在为我的 bashrc 使用一个中心位置,并为我的所有用户提供源代码,如下所示:

GLOBAL_BASHRC="/path/to/global/bashrc"

if [ -r "$GLOBAL_BASHRC" -a -f "$GLOBAL_BASHRC" ]; then
    # Load the bashrc
    source $GLOBAL_BASHRC
else
    echo "Warning: Bashrc file [${GLOBAL_BASHRC}] does not exist!"
fi

现在我想对我的 inputrc 文件做同样的事情。我已经找到了如何执行与 inputrc 中的源代码相同的操作这个问题:

$include /path/to/global/inputrc

但问题是,就像上面的 bashrc 中一样,我想要一些错误处理,我只想加载该文件(如果它确实存在)。因此我的问题是,如何指定 if 语句检查我的 inputrc 中是否存在文件?

答案1

您不需要$include从您的,~/.inputrc因为您可以随时读取 inputrc 文件

bind -f /path/to/global/inputrc

因此,请使用您常用的if [ -r file ]this 而不是source.


的手册页显示,对于交互式登录 shell,它读取/etc/profile 并第一个找到~/.bash_profile~/.bash_login~/.profile。对于其他交互式 shell,它读取~/.bashrc,对于非交互式 shell,它读取文件$BASH_ENV(如果有)。

在您的情况下,您可能正在使用终端仿真器的非登录交互式 shell,因此~/.bashrc可以读取。您可以使用strace和 虚拟 home 来查看会发生什么,例如在 中/tmp

$ touch /tmp/.inputrc /tmp/.bashrc
$ (unset BASH_ENV INPUTRC HISTFILE
   HOME=/tmp strace -e open -o /tmp/out bash -i)

这显示了正在打开的以下文件(为了简洁起见,我删除了一些文件):

open("/tmp/.bashrc", O_RDONLY)          = 3
open("/tmp/.bash_history", O_RDONLY)    = -1 ENOENT
open("/tmp/.inputrc", O_RDONLY)         = 3
open("/tmp/.bash_history", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 3

所以 bash 会在 ..inputrc之后读取.bashrc。这是有道理的,因为它让您有时间INPUTRC在文件中进行设置。

答案2

您可以在文件中设置环境变量,而不是在文件中执行此操作.inputrc(据我所知,该文件无法检查文件是否确实存在):INPUTRC.bashrc

if [ -r "$GLOBAL_BASHRC" -a -f "$GLOBAL_BASHRC" ]; then
    # Load the bashrc
    source $GLOBAL_BASHRC
    if [ -f /path/to/global/inputrc ]; then
        export INPUTRC="/path/to/global/inputrc"
    fi
else
    echo "Warning: Bashrc file [${GLOBAL_BASHRC}] does not exist!"
fi

INPUTRC变量记录在readline手册中(也记录在bash手册中)。

相关内容