我往里面看了看/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";
好的,现在怎么样
eval
,eval
只需运行命令替换返回的两个命令:eval "$(SHELL=/bin/sh lesspipe)"
此后,变量
LESSOPEN
和LESSCLOSE
将成为运行此命令的 shell 的环境变量。