在类 Ubuntu 的 linux 上,默认.bashrc
文件包含一行:
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
那为什么SHELL=/bin/sh lesspipe
语法正确呢?哪一页man bash
能知道这句话的意思?对我来说,这个陈述似乎与,例如,
ls echo
,这是无效的。还,
abc=hello echo $abc
没有错误,但输出 null。
man bash
尽管我尝试了一些/<expression>
搜索命令,但我找不到任何相关信息less
。谁能告诉我命令的解释?
注意:我已经阅读了帖子“你能在默认的 .bashrc 中解释 eval 表达式吗”,但一无所获。
正如 steeldriver 所说,
SHELL=/bin/sh lesspipe
是一个简单的命令,它被定义为以下序列:SHELL=/bin/sh
),后跟...lesspipe
),由...终止你的第一个例子:
实际上是一个有效的命令:只有第一个单词被视为要执行的命令,其余的作为参数提供给该命令¹。
在
ls
命令的情况下,如果当前目录下有命名echo
的子目录,则列出其内容;如果存在名为 的非目录echo
,则会显示其名称²。如果两者都不是,该命令将返回错误并显示No such file or directory
错误消息。你的第二个例子:
同样是一个带有变量赋值的简单命令,但它还包括一个变量扩展 (
$abc
)。的EXPANSION章节man bash
定义了各种扩展及其操作顺序。将命令行拆分为单词后,shell 会检查扩展:
$abc
替换为shell的当前值或名为的环境变量abc
。但由于此命令行尚未执行,因此 (abc=hello
) 行前面的变量赋值尚未生效。结果,$abc
将替换abc
为之前的任何值,或者如果未设置,则替换为空字符串。然后将空字符串完全删除,因为它没有被引用。$abc
变量扩展的结果,但在空字符串中没有什么可以拆分的。一旦扩展完成,
abc
待启动实用程序环境中的变量设置为值“hello”并echo
执行命令。它只输出一个空行。¹ 严格来说,
ls
也作为参数传递,作为它的argv[0]
.ls
使用该参数来了解它是如何被调用的,在它输出的错误消息中也使用它,但不将其视为要采取行动的选项或文件。² 如果它是一个符号链接,但它的目标不能被解析,一些
ls
实现会输出一个错误信息,好像文件不存在一样