什么是bash手册中的一行,"扩展是在命令行被拆分成单词后执行的。"

时间:2016-08-25 09:37:43

标签: bash

我正在阅读bash manual on "Expansion", 它说它有7种类型的扩展/替换,包括"分词"。 另一方面,它在项目的头部说:

  

扩展在分割为单词后在命令行上执行。

我无法理解什么是"分成单词"。换句话说,我无法理解"分成单词"和"单词拆分算作扩展"。

请告诉我"扩展是在命令行分割为单词后执行的。"装置

是否意味着,假设

$> var1="word splitting"
$> var2="single_word"
$> command var1 var2

"在将命令行拆分为单词后,在命令行上执行扩展。" - >解析单词

word1 = command
word2 = var1
word3 = var2

"单词分裂" - >通过分隔符

分配位置参数
$1 = "word"
$2 = "splitting"
$3 = "single_word"

非常感谢。

2 个答案:

答案 0 :(得分:1)

这里的人比我更了解bash,但我会试一试。

正如您所引用的那样,该手册描述了在完成任何其他操作之前,该命令被拆分为单词。 编辑:正如rici(感谢)指出的那样,命令行的解析规则与扩展后的单词拆分不同。除了其他差异之外,不会查询IFS变量,而是简单地用空格或特殊字符(空格是制表符或空格)分隔单词。请参阅以下评论以获取示例。

然后执行所有其他扩展。然后,

  

shell扫描参数扩展命令的结果   用于分词的替换和算术扩展。

基本上,它将其他扩展的结果视为新的命令行,但有一些例外。

$> command $var1 $var2
由于参数扩展,

(请注意,在使用时必须在变量名前加上美元符号):

command word splitting single_word

(一个字符串,字母和空格)。这个字符串(整行)再次分成了明显的单词。第一个单词通常被解释为命令,其他单词成为命令的位置参数。 command会看到 $ 1为 word ,$ 2为拆分,$ 3为 single_word

因此,单词拆分以不同的方式执行两次:一次在原始命令行上,尊重引号和其他特殊结构;并且一旦在其他扩展的结果上,使用IFS变量,忽略引号等。顺便说一句,bash不会递归地执行该结果的其他扩展(也就是说,如果作为扩展的结果的位置参数是字符串如“$ var1”,字面意思,就好像用单引号传递一样。)

答案 1 :(得分:1)

当bash手册说明:

  

扩展在分割为单词后在命令行上执行。

这意味着命令行作为整个字符串开始,然后,从左到右,该字符串在元字符上分割:

  

元字符
     一个字符,当不加引号时,分隔单词。以下之一:
               | &安培; ; ()< >空格标签

这种分裂的结果被称为"单词"或者"令牌"。

这适用于整个命令行字符串。

相比之下,所谓的"单词分裂"仅适用于未引用扩展的结果"并仅使用$IFS中的字符进行拆分。

因此,此命令行只打印两行:

$ a="word splitting"  b="single_word"

$ printf '%s\n' "$a" "$b"
word splitting
single_word

命令行:printf '%s\n' "$a" "$b"被空格分成四个标记(单词):

一个:printf,两个:'%s\n'三个:"$a"和四个:"$b"

如果同一命令行不加引号:

$ printf '%s\n' $a $b
word
splitting
single_word

然后,第三个标记(单词):word splitting受到单词拆分的影响,变成两个标记(单词):wordsplitting(因为IFS默认包含一个空格)

第四个令牌也受到分词(因为它没有引用),但仍然是一个令牌(单词),因为它没有IFS字符。

请注意"单词拆分"通常与globing有关,因为两者都适用于不带引号的扩展。可以通过命令set -f关闭Globing,并且可以通过引用来避免分词。