你能解释一下默认 .bashrc 中的 eval 表达式吗

你能解释一下默认 .bashrc 中的 eval 表达式吗

我往里面看了看/etc/skel/.bashrc,发现了这一行:

[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

我理解测试的作用-x,但随后的一切eval却无法理解。

此外,当我在其他 Linux 发行版中运行此行时,它会导致错误:

#  eval "$(SHELL=/bin/bash lesspipe)"
bash: syntax error near unexpected token `newline'

这是在 Ubuntu 14.04 (bash 4.3.11(1))上,我测试的另一个 bash 版本是 4.3.39(1)。

你能解释一下这一行的作用吗?为什么我会收到上述错误?

答案1

为了理解该eval代码片段eval "$(SHELL=/bin/sh lesspipe)",我们需要将其分解:

  • 首先我们来检查一下SHELL=/bin/sh lesspipe返回的内容:

    $ SHELL=/bin/sh lesspipe
    export LESSOPEN="| /usr/bin/lesspipe %s";
    export LESSCLOSE="/usr/bin/lesspipe %s %s";
    

    如您所见,它返回两个命令,其中包含变量声明,前面带有变量声明,export以使它们成为环境变量。

  • 现在另一件事$()是命令替换语法,它返回的正是我们上面看到的,即命令的输出,让我们检查一下:

    $ echo "$(SHELL=/bin/sh lesspipe)"
    export LESSOPEN="| /usr/bin/lesspipe %s";
    export LESSCLOSE="/usr/bin/lesspipe %s %s";
    
  • 好的,现在怎么样evaleval只需运行命令替换返回的两个命令:

    eval "$(SHELL=/bin/sh lesspipe)"
    

    此后,变量LESSOPENLESSCLOSE将成为运行此命令的 shell 的环境变量。

相关内容