shell执行过程简介

[root@fire cgi-bin]# export TEST="Hello
> Wolrd
> From
> Linux"
[root@fire cgi-bin]# echo $TEST 
Hello Wolrd From Linux
[root@fire cgi-bin]# echo "$TEST" 
Hello
Wolrd
From
Linux
[root@fire cgi-bin]# echo '$TEST'
$TEST

上面是测试,一直以来对hard quote(单引号)和soft quote(双引号),弄得不是很懂,今早又碰到这个问题。

下面来解释上面的测试代码:

首先从根本出发,shell的任务的就是解释用户的输入,将一大堆的字符串做处理。处理成

command_program options  arguments

这样的格式,说白了就是把一个整的字符串分割成一个一个的字段("word"),那么shell是通过什么分割的呢?通过把<space>,<enter>,<tabs>这三种作为分隔符,拆分成字段。而shell是通过最后用户输入一个<enter>键来标明用户输入的结束,一旦处理到<enter>键,shell就得到了通知:用户已经输入完成了,我可以执行命令去了。之后shell根据默认的IFS处理,进行变量的替换之类的工作,最后提交给程序执行。

看上面的第一个命令

[root@fire cgi-bin]# export TEST="Hello
> Wolrd
> From
> Linux"

因为soft quote能屏蔽<enter>,<enter>键所产生的CR字符不会被shell当作结束符,所以shell继续等待用户的输入,等到用户输入后面的双引号,再输入<enter>键,这时候shell读到了CR字符,就知道用户输入的结束了,于是就开始执行命令。这个时候TEST里面的内容其实是:

Hello<CR>World<CR>From<CR>Linux

注意“Linux”后面是没有<CR>的,之所以会有换行,是因为echo执行结束后会自动送入一个<CR>!

再看第二条命令:

echo $TEST

这时候没有hard quote或者soft quote,shell得到的命令变成

echo Hello<CR>World<CR>From<CR>Linux

现在再去看shell的执行过程,shell就是“把一个整的字符串拆分成字段,字段分割的标识是<space>,<enter>,<tabs>,然后根据默认的IFS处理”,shell读到<CR>,通通都按照默认的IFS(空格)处理。所以处理的结果就可想而知了:所有的<CR>变成了<space>。最后得到的最终命令,按照

command_program options  argumentscommand_program 就是 echo ,options 是无 ,arguments 就是 Hello World From Linux

再来看第三条命令

echo "$TEST"

这个存在soft quote,shell得到命令就是

echo "Hello<CR>World<CR>From<CR>Linux"

这里shell不能处理什么,soft quote里面就是一个参数,最终的命令是

command_program 就是 echo ,options 是无 ,arguments 就是 Hello<CR>World<CR>From<CR>Linux

最后看第四条命令

echo '$TEST'

这个最简单, TEST变量在hard quote里面,所有的meta都被屏蔽了,所以按照最终的命令就是

command_program 就是 echo ,options 是无 ,arguments 就是 $TEST

标签:Linux, Shell

评论已关闭