Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash手册中的一行是什么意思;将命令行拆分为字后,将在命令行上执行扩展;_Bash - Fatal编程技术网

bash手册中的一行是什么意思;将命令行拆分为字后,将在命令行上执行扩展;

bash手册中的一行是什么意思;将命令行拆分为字后,将在命令行上执行扩展;,bash,Bash,我在读书, 它说它有7种扩展/替换类型,包括“分词”。 另一方面,它在项目的开头说: 将命令行拆分为单词后,将在命令行上执行展开 我不明白什么是“分裂成文字”。换言之,我无法理解“拆分为单词”和“将单词拆分视为扩展”之间的区别 请让我知道什么是“在命令行被拆分为单词后在命令行上执行的扩展” 这是否意味着,假设 $> var1="word splitting" $> var2="single_word" $> command var1 var2 “将命令行拆分为单词后,在命令行

我在读书, 它说它有7种扩展/替换类型,包括“分词”。 另一方面,它在项目的开头说:

将命令行拆分为单词后,将在命令行上执行展开

我不明白什么是“分裂成文字”。换言之,我无法理解“拆分为单词”和“将单词拆分视为扩展”之间的区别

请让我知道什么是“在命令行被拆分为单词后在命令行上执行的扩展”

这是否意味着,假设

$> var1="word splitting"
$> var2="single_word"
$> command var1 var2
“将命令行拆分为单词后,在命令行上执行扩展。”->解析单词

word1 = command
word2 = var1
word3 = var2
“分词”->按分隔符指定位置参数

$1 = "word"
$2 = "splitting"
$3 = "single_word"

非常感谢。

这里有人比我更了解bash,但我会尝试一下

正如您所引用的,该手册描述了在执行任何其他操作之前,该命令被拆分为多个单词Edit:正如rici(感谢)指出的,命令行的解析规则与扩展后的分词规则不同。除其他差异外,不参考IFS变量,而是用空格或特殊字符(空格是制表符或空格)简单地分隔单词。有关示例,请参见下面的注释

然后执行所有其他扩展。那么

shell扫描参数扩展的结果,命令 替换和用于分词的算术展开[…]

本质上,它将其他扩展的结果视为一个新的命令行,只有少数例外

$> command $var1 $var2
(请注意,使用时必须在变量名称前加上美元符号)由于参数扩展而变为:

command word splitting single_word
(一个字符串、字母和空格)。此字符串(整行)再次拆分为明显的单词。第一个单词通常解释为命令,其他单词则成为命令的位置参数<代码>命令将看到 $1作为单词,$2作为拆分,$3作为单个单词


因此,以不同的方式执行两次分词:一次在原始命令行上,使用引号和其他特殊构造;在其他扩展的结果上,使用IFS变量,忽略引号等。顺便说一句,bash不会递归地对该结果执行其他扩展(也就是说,如果作为扩展结果的位置参数是一个类似“$var1”的字符串,则按字面理解,就像以单引号传递它一样).

当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
然后,第三个标记(单词):
单词拆分
将进行单词拆分,并成为两个标记(单词):
单词
拆分
(因为默认情况下IFS包含空格)

第四个标记也要进行分词(因为它没有引号),但仍然作为一个标记(单词),因为它没有IFS字符


请注意,“分词”通常与全局关联,因为两者都应用于无引号的扩展。通过命令
set-f
可以关闭全局搜索,使用引号可以避免分词。

感谢fedorqui编辑上述问题。如果您不介意,请告诉我如何制作黄色单元格“Expansion~~~”,或者请告诉我您遵循的格式/规则和堆栈溢出编辑工具的位置。谢谢,你看。另外,如果你想提及某人,你需要在他/她的名字前面加上
@
。所以我看到了这条评论,因为我再次输入了问题,但要得到通知,你应该说
@fedorqui…
@fedoqui谢谢你给我的指导。非常感谢。如果你看到我之前的评论,请不要介意。我的意见没有多大意义。再次感谢您使用
IFS
不会将命令解析为单词。标准中规定了精确的解析算法,并在shell手册中进行了记录。它识别引用字符和自定界字符,如
。分词(严格基于
IFS
)是完全不同的。重要的是不要混淆这两种截然不同的操作。@rici谢谢。下面的例子就是你的意思吗?我刚试过:
a=\'ls \-l\;echo$a$一个
,结果是
“ls-l”
,下一行:
-bash:“ls:command not found
。与简单的
“ls-l”
相反,它会导致
-bash:ls-l:command not found
。区别在于
“ls-l>时它是整个命令“
直接在命令行上给出,因为最初的命令解析尊重引号,而扩展
$a
的结果只是在空格处拆分为单词,忽略引号,因此第一个单词就是
”ls
@Charles我认为是dist