彩世界开奖app官网-彩世界平台官方网址(彩票平台)
做最好的网站
来自 彩世界开奖app官网 2019-11-28 05:10 的文章
当前位置: 彩世界开奖app官网 > 彩世界开奖app官网 > 正文

shell解析命令行的过程以及eval命令彩世界开奖a

1.1 shell分析命令行

shell读取和施行命令时的差非常的少操作进度如下图:

彩世界开奖app官网 1

(注:图中向来不画出"函数"的职务。它的任务和小名并列,但先行级低于别称。也便是说,假诺函数和下令小名同名,则先执行外号。)

以实行以下命令为例:

echo -e "some files:" ~/i* "nThe date:$(date  %F)n$name's age is $((a 4))" >/tmp/a.log

要是在实践该命令前,已赋值变量"name=longshuai"和"a=24",于是重定向到/tmp/a.log中的结果为:

some files: /root/inotify.sh /root/inotify.sh.ori
The date:2017-08-14
longshuai's age is 28

(1).读取输入的命令行。

(2).深入解析引用并分割命令行为各类单词,各单词称为token。个中重定向所在的token会被保留下去,直到扩大步骤(5)甘休后才开展相关处理,如进行扩张、截断文件等。

shell中有3种援用形式:反斜线引用、单引号援引和双引号援引。

◇ 反斜线转义:使得元字符变为经常的字面字符。但这不能不对反斜线后一个字符实行转义。

◇ 单引号援引:单引号内的具有字符全体变成字面符号符号。但只顾:单引号内不能够再选拔单引号,尽管使用了反斜线转义也不允许。

◇ 双引号引用:使双引号内有所字符变为字面符号,但""、"$"、"`"(反引号)除却,即便展开了"!"引用历史命令时,则惊叹号也除了那一个之外。

深入分析引用后,于是就能够将命令行进行单词分割,分割后的每风流倜傥部分都叫作三个token。分隔时,不独有分割单个命令,还分割命令列表,所以分隔符包罗:空格、tab、分号、管道符号、&、&&、||、重定向符号、圆括号等。

于是上述命令分割为以下多少个token:

彩世界开奖app官网 2

假诺分割时意识了管道符号,恐怕是命令列表等组成了三个指令的气象,则每一种命令都的token都互相独立。

(3).检查命令行布局。主要检查是不是有发号布令列表、是不是有shell编制程序构造的授命,如if判别命令、循环结构的for/while/select/until,这个命令归属保留主要字,必要特殊管理。

(4).对第一个token举行小名扩大。假如检查出它是小名,则扩展后回去(2)再度进行token分解进度。如果检查出它是函数,则试行函数体中的复合命令。即使它既是小名,又是函数(即命令外号和函数同名称的事态),则优先实践小名。在概念上,别名的暂行最强,优先级最高。

(5).实行各样扩充。扩充顺序为:大括号扩大;波浪号扩大;参数、变量和指令替换、算术扩大(借使系统辅助,此步还拓宽进程替换);单词拆分;文件名扩大。

不等引号的引用情势,将改成扩张的起先步骤,正如上海体育场面所画,未有别的引号时将持锲而不舍全体恢宏,使用单引号时将完全不交易会开别的扩充,使用双引号时将从变量替换早前继续强盛。

①大括号扩大:如/tmp/{a,b}.log扩大为/tmp/a.log和/tmp/b.log。

②波浪号扩充:增添为家目录。如root客商下的~/.ssh扩展为/root/.ssh。

③变量扩大:即操作和替换变量值。如$a替换为它的值24, ${name:-longshuai} 替换为longshuai。

④指令替换:此进程将实施命令替换中的命令,并将结果替换来token的应和地点处。

⑤经过替换:将经过的施行结果替换来对应地点。相仿于命令替换。替换格式为"<(cmd_list)"和">(cmd_list)",比方 cat <(cat /etc/hosts) 。redhat连串应该都帮忙进度替换。

⑥算术扩大:计算算术值,并将总计结果替换成对应地点处。举例$((a 4))替换为28。

通过以上三种扩张后,得到如下结果:

彩世界开奖app官网 3

⑦单词拆分:扫描变量扩张、命令替换和算术扩张的结果,对非引号内的结果根据$IFS的值对这个结果开展单词分割。

只顾,若无张开扩展,恐怕扩张结果使用引号包围了,则不会进展此步的单词拆分。

默许景况下,$IFS值为"   tn",所以扩充结果中每碰着空格、制表符、换行符都将被划分为八个单词。

这一步其实十分轻易犯错,典型的是test命令。比方变量 name="Ma longshuai" ,则 test $name == "longshuai" 将报错,因为变量扩充后该语句变为 test Ma longshuai == "longshuai" ,由于是变量替换,所以随后张开单词拆分,使得Ma和longshuai被拆分为七个单词,但实际上它们一齐组成变量name的值。

据此,为了科学操作变量替换和下令替换,尽量将它们选用引号包围。比如 test "$name" == "longshuai" ,那个时候将不会进行单词拆分。

⑧文件名扩大:对每一种token进行寻觅,将寻找"*"、"?"和"["符号,搜索到了将拓宽文件名扩充。举例将地点的"/root/i*"扩展为"/root/inotify.sh /root/inotify.sh.ori"。

(6).引号去除。经过位置的历程,该扩大的都扩充了,无需的引号在这里步就足以去掉了。

故此获得如下结果。

彩世界开奖app官网 4

(7).搜索和执行命令。

单词分割后,复杂的授命行将由逐条简单命令布局构成。于是能够寻觅每一个轻松命令布局的率先个token中的命令,同时还富含一应有尽有命令选项。例如地方的"echo"和"-e"。

若果命令中不含任何斜杠:

①则先推断是或不是有此名称的shell function存在,假使有则调用它,不然举办下一步寻觅。

②论断该命令是或不是为bash内置命令,要是是则进行它,不然举行下一步寻找。

③从$PATH的门路下搜索该命令,即便寻找到了,则试行,不然报错。

只要命令中隐含叁个或多少个斜杠,则开展相对路线增加、相对路线查找,找到了则执行,不然报错。

(8).重回降出状态码。

1.1 shell解析命令行

shell读取和推行命令时的光景操作进度如下图:

 彩世界开奖app官网 5

以举办以下命令为例:

echo -e "some files:" ~/i* "nThe date:$(date  %F)n$name's age is $((a 4))" >/tmp/a.log

假诺在实行该命令前,已赋值变量"name=longshuai"和"a=24",于是重定向到/tmp/a.log中的结果为:

some files: /root/inotify.sh /root/inotify.sh.ori
The date:2017-08-14
longshuai's age is 28

(1).读取输入的命令行。

(2).分析援引并分割命令行为各类单词,各单词称为token。在这之中重定向所在的token会被保留下去,直到扩大步骤(5)截至后才开展相关管理,如实行扩充、截断文件等。

shell中有3种援引方式:反斜线援用、单引号援引和双引号援用。

◇ 反斜线转义:使得元字符变为平日的字面字符。但这不得不对反斜线后叁个字符实行转义。

◇ 单引号援引:单引号内的具有字符全体成为字面符号符号。但只顾:单引号内不能够再采用单引号,即便使用了反斜线转义也不允许。

◇ 双引号援用:使双引号内有所字符变为字面符号,但""、"$"、"`"(反引号)除却,即便翻开了"!"援用历史命令时,则感叹号也除却。

剖析引用后,于是就能够将命令行进行单词分割,分割后的每意气风发部分都叫作八个token。分隔时,不仅仅分割单个命令,还分割命令列表,所以分隔符包涵:空格、tab、分号、管道符号、&、&&、||、重定向符号、圆括号等。

于是上述命令分割为以下多少个token:

彩世界开奖app官网 6

设若分割时发掘了管道符号,可能是命令列表等构成了多少个指令的景色,则每种命令都的token都竞相独立。

(3).检查命令行布局。首要检查是还是不是有指令列表、是还是不是有shell编制程序构造的吩咐,如if判定命令、循环构造的for/while/select/until,那个命令归属保留主要字,需求独特管理。

(4).对第4个token举行别称扩充。假若检查出它是小名,则扩张后回到(2)再度张开token分解进程。

(5).实行各类扩充。扩大顺序为:大括号扩充;波浪号扩张;参数、变量和下令替换、算术扩大(假使系统帮助,此步还开展进度替换);单词拆分;文件名扩大。

不等引号的引用格局,将转移扩充的开场步骤,正如上海体育场所所画,未有任何引号时将坚持全部恢宏,使用单引号时将完全不会开展其余扩展,使用双引号时将从变量替换初阶持续扩充。

①大括号扩张:如/tmp/{a,b}.log扩充为/tmp/a.log和/tmp/b.log。

②波浪号扩大:扩张为家目录。如root顾客下的~/.ssh扩展为/root/.ssh。

③变量扩充:即操作和替换变量值。如$a替换为它的值24,${name:-longshuai}替换为longshuai。

④发令替换:此进度将实行命令替换中的命令,并将结果替换来token的呼应地方处。

⑤经过替换:将经过的履行结果替换成对应地点。相近于命令替换。替换格式为"<(cmd_list)"和">(cmd_list)",比如"cat <(cat /etc/hosts)"。redhat种类应该都支持进度替换。

⑥算术扩张:总计算术值,并将总计结果替换来相应地方处。例如$((a 4))替换为28。

通过以上三种扩张后,获得如下结果:

彩世界开奖app官网 7

⑦单词拆分:扫描变量增添、命令替换和算术增加的结果,对非引号内的结果依据$IFS的值对这么些结果开展单词分割。

专心,若无展开扩充,恐怕扩大结果使用引号包围了,则不会实行此步的单词拆分。

暗中同意情状下,$IFS值为"   tn",所以扩大结果中每境遇空格、制表符、换行符都将被细分为八个单词。

这一步其实十分轻松犯错,标准的是test命令。比如变量name="Ma longshuai",则test $name == "longshuai"将报错,因为变量扩大后该语句变为test Ma longshuai == "longshuai",由于是变量替换,所以随后进行单词拆分,使得Ma和longshuai被拆分为多个单词,但实际它们一同整合变量name的值。

据此,为了科学操作变量替换和指令替换,尽量将它们采纳引号包围。比如test "$name" == "longshuai",这个时候将不交易会开单词拆分。

⑧文件名扩张:对每种token举行检索,将追寻"*"、"?"和"["符号,寻觅到了将张开文件名扩张。举个例子将地方的"/root/i*"扩展为"/root/inotify.sh /root/inotify.sh.ori"。

(6).引号去除。经过地点的长河,该扩大的都扩展了,没有必要的引号在那步就能够去掉了。

故此博得如下结果。

彩世界开奖app官网 8

(7).找出和推行命令。

单词分割后,复杂的授命行将由逐条简单命令布局构成。于是能够寻找每种轻易命令结构的率先个token中的命令,同一时间还蕴含生机勃勃连串命令选项。比如地点的"echo"和"-e"。

若是命令中不含任何斜杠:

①则先剖断是还是不是有此名称的shell function存在,若是有则调用它,不然进行下一步搜索。

②料定该命令是或不是为bash内置命令,假若是则实行它,否则进行下一步寻觅。

③从$PATH的门路下搜寻该命令,假诺找寻到了,则进行,不然报错。

尽管命令中蕴藏二个或四个斜杠,则开展相对路线扩充、相对路线查找,找到了则实行,不然报错。

(8).重临降出状态码。

1.1 shell剖析命令行

shell读取和实施命令时的光景操作进度如下图:

彩世界开奖app官网 9

以施行以下命令为例:

echo -e "some files:" ~/i* "nThe date:$(date  %F)n$name's age is $((a 4))" >/tmp/a.log

借使在进行该命令前,已赋值变量"name=longshuai"和"a=24",于是重定向到/tmp/a.log中的结果为:

some files: /root/inotify.sh /root/inotify.sh.ori
The date:2017-08-14
longshuai's age is 28

(1).读取输入的命令行。

(2).拆解深入分析援引并私分命令行为各样单词,各单词称为token。在那之中重定向所在的token会被封存下去,直到增加步骤(5)甘休后才开展相关管理,如举办扩充、截断文件等。

shell中有3种援引情势:反斜线援引、单引号援用和双引号援用。

◇ 反斜线转义:使得元字符变为管见所及的字面字符。但那只好对反斜线后二个字符进行转义。

◇ 单引号援用:单引号内的有着字符全体化为字面符号符号。但只顾:单引号内无法再利用单引号,就算使用了反斜线转义也分化意。

◇ 双引号援引:使双引号内具备字符变为字面符号,但""、"$"、"`"(反引号)除却,要是张开了"!"引用历史命令时,则惊讶号也除此之外。

浅析援引后,于是就能够将命令行实行单词分割,分割后的每黄金时代部分都称为七个token。分隔时,不仅仅分割单个命令,还分割命令列表,所以分隔符富含:空格、tab、分号、管道符号、&、&&、||、重定向符号、圆括号等。

于是上述命令分割为以下多少个token:

彩世界开奖app官网 10

万一分割时意识了管道符号,或许是命令列表等组成了三个指令的事态,则每种命令都的token都互相独立。

(3).检查命令行构造。首要检查是否有指令列表、是或不是有shell编制程序构造的授命,如if决断命令、循环构造的for/while/select/until,这几个命令归于保留主要字,须要独特管理。

(4).对首个token进行别称扩张。借使检查出它是小名,则扩展后归来(2)再度张开token分解进度。

(5).进行各样扩大。增加顺序为:大括号扩充;波浪号扩充;参数、变量和下令替换、算术扩展(假诺系统协理,此步还扩充进程替换);单词拆分;文件名扩大。

不一样引号的援引方式,将转移扩大的原开头骤,正如上图所画,未有任何引号时将坚定不移全体恢宏,使用单引号时将完全不会进行别的扩张,使用双引号时将从变量替换发轫持续扩大。

①大括号扩充:如/tmp/{a,b}.log扩充为/tmp/a.log和/tmp/b.log。

②波浪号增添:增加为家目录。如root客商下的~/.ssh扩展为/root/.ssh。

③变量扩张:即操作和替换变量值。如$a替换为它的值24,${name:-longshuai}替换为longshuai。

④发令替换:此进度将实行命令替换中的命令,并将结果替换来token的相应地方处。

⑤历程替换:将经过的施行结果替换成相应地点。相像于命令替换。替换格式为"<(cmd_list)"和">(cmd_list)",比如"cat <(cat /etc/hosts)"。redhat连串应该都扶持进程替换。

⑥算术扩充:总括算术值,并将计算结果替换来相应地点处。比方$((a 4))替换为28。

经过上述两种扩展后,获得如下结果:

彩世界开奖app官网 11

⑦单词拆分:扫描变量扩张、命令替换和算术扩充的结果,对非引号内的结果依据$IFS的值对那个结果实行单词分割。

小心,若无实行扩充,也许扩大结果运用引号包围了,则不会进展此步的单词拆分。

暗中认可意况下,$IFS值为"   tn",所以扩充结果中每遭逢空格、制表符、换行符都将被分割为八个单词。

这一步其实超轻易犯错,规范的是test命令。举例变量name="Ma longshuai",则test $name == "longshuai"将报错,因为变量扩充后该语句变为test Ma longshuai == "longshuai",由于是变量替换,所以随着开展单词拆分,使得Ma和longshuai被拆分为八个单词,但其实它们一同构成变量name的值。

故而,为了科学操作变量替换和下令替换,尽量将它们利用引号包围。比方test "$name" == "longshuai",那个时候将不会进行单词拆分。

⑧文件名扩张:对各种token进行搜索,将找寻"*"、"?"和"["符号,搜索到了将拓宽文件名扩充。举例将方面的"/root/i*"扩展为"/root/inotify.sh /root/inotify.sh.ori"。

(6).引号去除。经过地方的历程,该扩充的都扩充了,无需的引号在那步就足以去掉了。

由此得到如下结果。

彩世界开奖app官网 12

(7).寻找和实行命令。

单词分割后,复杂的指令行将由各类轻便命令构造构成。于是能够搜索各样简单命令布局的第3个token中的命令,同一时间还蕴涵一五花八门命令选项。举个例子地点的"echo"和"-e"。

只要命令中不含任何斜杠:

①则先判定是不是有此名称的shell function存在,假诺有则调用它,不然实行下一步寻找。

②剖断该命令是不是为bash内置命令,即便是则试行它,不然进行下一步找寻。

③从$PATH的渠道下搜寻该命令,要是寻觅到了,则进行,不然报错。

只要命令中包含三个或三个斜杠,则开展相对路线扩展、相对路线查找,找到了则实行,不然报错。

(8).再次回到降出状态码。

bash&shell体系文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html**

1.2 eval命令

健康意况下,当搜索到命令时将会实行命令,但要是搜索到的通令为eval时,则管理格局有所分裂。

它的语法格式为:

eval command arguments

信守前文所述shell深入分析进度,将最后收获eval command和一文山会海扩充后的选项、参数,当寻找命令时,找出到的结果为eval命令,于是eval命令将除了eval命令(以致eval的筛选)的具有token再度传递给shell实行二回深入分析。但重定向所在token除此之外,因为重定向token早就被shell保存下来,所以不会再度截断文件。

也正是说,"command arguments"被充作eval命令的参数,被传送给shell实行解析、推行。

推行进度如下图所示:

彩世界开奖app官网 13

运用示例来评释:

[[email protected] ~]# a=24;name='long$a'     # 注意,使用的是单引号,禁止$a被扩展

假若一直推行echo $name,则结果为"long$a",但只要试行eval echo $name,结果将是"long24"。

[[email protected] ~]# eval echo $name
long24

先是shell依据正规进程拆解分析,在变量替换时由于应用了单引号,所以$name第二次变量替换的结果为"long$a",直到命令找寻时意识搜索到的命令是eval命令,试行eval命令,该命令将其参数"echo long$a"再度传递给shell,约等于在标准输入中输入了"echo long$a",于是shell举办一回深入深入分析,此番的变量替换将$a替换为24,最终寻找命令开掘是echo命令,于是最终得到"long24"。

至于eval,更多的用法是直接变量$$var的用法,在bash shell中须求在率先个$前加多反引号,即$$var,这么做的缘故是明摆着的:防止第三次shell解析时被看作特殊变量"$$"被扩展。

[[email protected] ~]# a=b
[[email protected] ~]# b=haha

[[email protected] ~]# eval echo $$a
haha

 

注:本文并不是必然规范,只是依据man bash总计而来。如有错误,请鲜明建议。多谢

 

重返类别文章大纲:

shell分析命令行的历程以至eval命令

 

正文评释的是一条linux命令在奉行时大约要由此什么样进程?以至那么些经过的大意顺序。

正文注明的是一条linux命令在奉行时大概要通过什么样进程?以致那些经过的大要顺序。

转载请表明出处:

1.2 eval命令

正规情形下,当寻找到命令时将会推行命令,但假若寻觅到的授命为eval时,则管理形式有所不相同。

它的语法格式为:

eval command arguments

信守前文所述shell深入分析进程,将最后收获eval command和生龙活虎多元扩充后的选项、参数,当寻找命令时,搜索到的结果为eval命令,于是eval命令将除了eval命令(以至eval的选用)的享有token再度传递给shell进行一回剖析。但重定向所在token除此而外,因为重定向token早就被shell保存下去,所以不会再一次截断文件。

也便是说,"command arguments"被当做eval命令的参数,被传送给shell举办剖析、实践。

执行进度如下图所示:

彩世界开奖app官网 14

应用示例来证实:

[root@xuexi ~]# a=24;name='long$a'     # 注意,使用的是单引号,禁止$a被扩展

假设直白试行echo $name,则结果为"long$a",但假使施行eval echo $name,结果将是"long24"。

[root@xuexi ~]# eval echo $name
long24

首先shell遵照正规进度剖判,在变量替换时出于应用了单引号,所以$name第叁回变量替换的结果为"long$a",直到命令寻觅时意识寻觅到的指令是eval命令,实行eval命令,该命令将其参数"echo long$a"再一次传递给shell,也正是在专门的学业输入中输入了"echo long$a",于是shell实行三回拆解深入分析,此番的变量替换将$a替换为24,最终寻找命令发掘是echo命令,于是最终获得"long24"。

关于eval,更加多的用法是间接变量$$var的用法,在bash shell中供给在第贰个$前增加反引号,即$$var,这么做的案由是大名鼎鼎的:制止第二回shell剖析时被作为特殊变量"$$"被扩充。

[root@xuexi ~]# a=b
[root@xuexi ~]# b=haha

[root@xuexi ~]# eval echo $$a
haha

 

注:本文并不是一定规范,只是依照man bash总括而来。如有错误,请明显提出。感激

 

回来种类小说大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


注:若您感觉那篇随笔还不易请点击下右下角的推荐,有了你的扶植工夫慰勉小编更加大的小说热情,非常多谢!

1.1 shell深入解析命令行 shell读取和推行命令时的概况操作进程如下图: 以施行以下命令为例:...

转发请证明出处:

1.2 eval命令

好端端情状下,当搜索到命令时将会实施命令,但假设搜索到的一声令下为eval时,则管理形式有所分化。

它的语法格式为:

eval command arguments

安分守己前文所述shell拆解解析进度,将最后得到eval command和风华正茂多种增加后的选项、参数,当寻觅命令时,找寻到的结果为eval命令,于是eval命令将除了eval命令(以致eval的挑选)的具备token再一次传递给shell举行二次深入分析。但重定向所在token除了这几个之外,因为重定向token早就被shell保存下去,所以不会重复截断文件。

也正是说,"command arguments"被当做eval命令的参数,被传送给shell实行解析、实施。

实践进度如下图所示:

彩世界开奖app官网 15

选取示例来注明:

[root@xuexi ~]# a=24;name='long$a'     # 注意,使用的是单引号,禁止$a被扩展

借使从来施行 echo $name ,则结果为"long$a",但只要进行 eval echo $name ,结果将是"long24"。

[root@xuexi ~]# eval echo $name
long24

第风度翩翩shell遵照正规进度解析,在变量替换时出于使用了单引号,所以$name第二回变量替换的结果为"long$a",直到命令找出时意识搜索到的授命是eval命令,实行eval命令,该命令将其参数 echo long$a 再一次传递给shell,相当于在行业内部输入中输入了 echo long$a ,于是shell进行一回分析,此次的变量替换将$a替换为24,最后搜索命令开掘是echo命令,于是最后获得"long24"。

至于eval,越来越多的用法是直接变量$$var的用法,在bash shell中要求在率先个$前加上反斜线,即 $$var ,这么做的来由是鲜明的:幸免第三回shell深入分析时被视作特殊变量"$$"被增加。

[root@xuexi ~]# a=b
[root@xuexi ~]# b=haha

[root@xuexi ~]# eval echo $$a
haha

 

注:本文并不是必然标准,只是依照man bash总括而来。如有错误,请明显提议。多谢

shell怎样分析命令行以至eval命令,shell拆解深入分析eval

本文由彩世界开奖app官网发布于彩世界开奖app官网,转载请注明出处:shell解析命令行的过程以及eval命令彩世界开奖a

关键词: shell 过程 eval