h5网站建设+北京,wordpress第三方客户端,基础设施建设网站,免费vip影视网站怎么做的以下内容源于C语言中文网的学习与整理#xff0c;如有侵权请告知删除。 1、问题引入
这里将Shell中的“进程替换”与“管道”放在一起讲#xff0c;是因为两者的作用几乎类似。
进程替换#xff1a;将一个命令的输出结果传递给另一个#xff08;组#xff09;命令。
管…以下内容源于C语言中文网的学习与整理如有侵权请告知删除。 1、问题引入
这里将Shell中的“进程替换”与“管道”放在一起讲是因为两者的作用几乎类似。
进程替换将一个命令的输出结果传递给另一个组命令。
管道将两个或者多个命令连接到一起把一个命令的输出作为下一个命令的输入以这种方式连接的两个或者多个命令就形成了管道。
它们都是将一个命令的输出传递给另一个命令那么它们有什么区别呢
我们首先看一个使用管道的例子。
xjhubuntu:~/iot/tmp$ echo http://c.biancheng.net/shell/ | read
xjhubuntu:~/iot/tmp$ echo $REPLYxjhubuntu:~/iot/tmp$
以上代码输出结果总是为空因为 echo $REPLY 命令在父 Shell 中执行而 read 命令在子 Shell 中执行当 read 执行结束时子 Shell 被销毁REPLY 变量也就消失了。 管道中的命令总是在子 Shell 中执行的任何给变量赋值的命令都会遭遇到这个问题。 使用read读取数据时如果没有提供变量名则读取到的数据将存放到环境变量 REPLY中。 2、进程替换
Shell 的“进程替换”可以用来解决这种麻烦。Shell 进程替换有两种写法
一种用来产生标准输出借助输入重定向它的输出结果可以作为另一个命令的输入
(commands)
另一种用来接受标准输入借助输出重定向它可以接收另一个命令的输出结果
(commands)
其中commands可以是命令列表命令之间用分号隔开另外或与圆括号之间是没有空格的。
【1】例如为了解决上面遇到的问题我们可以像下面这样使用进程替换
read (echo http://c.biancheng.net/shell/)
echo $REPLY
整体上来看Shell 把echo http://c.biancheng.net/shell/的输出结果作为 read 的输入。()用来捕获 echo 命令的输出结果用来将该结果重定向到 read。
注意两个之间是有空格的第一个表示输入重定向第二个和()连在一起表示进程替换。
本例中的 read 命令和第二个 echo 命令都在当前 Shell 进程中运行读取的数据也会保存到当前进程的 REPLY 变量大家都在一个进程中所以使用 echo 能够成功输出。
而在前面的例子中我们使用了管道echo 命令在父进程中运行read 命令在子进程中运行读取的数据也保存在子进程的 REPLY 变量中echo 命令和 REPLY 变量不在一个进程中而子进程的环境变量对父进程是不可见的所以读取失败。
【2】再来看一个进程替换用作“接受标准输入”的例子。因为使用了重定向read 命令从echo C语言中文网的输出结果中读取数据。
xjhubuntu:~/iot/tmp$ echo C语言中文网 (read; echo 你好$REPLY)
xjhubuntu:~/iot/tmp$ 你好C语言中文网xjhubuntu:~/iot/tmp$ 3、进程替换的本质
为了能够在不同进程之间传递数据实际上进程替换会跟系统中的文件关联起来也就是让某个文件当做中间者这个文件的名字为/dev/fd/nn 是一个整数。该文件会作为参数传递给()中的命令()中的命令对该文件是读取还是写入取决于进程替换格式是还是
1如果是()那么该文件会给()中的命令提供输入借助输出重定向要输入的内容可以从其它命令而来。
2如果是()那么该文件会接收()中命令的输出结果借助输入重定向可以将该文件的内容作为其它命令的输入。
使用 echo 命令可以查看进程替换对应的文件名
xjhubuntu:~/iot/tmp$ echo (true)
/dev/fd/63
xjhubuntu:~/iot/tmp$ echo (true)
/dev/fd/63
xjhubuntu:~/iot/tmp$ echo (true) (true)
/dev/fd/63 /dev/fd/62
xjhubuntu:~/iot/tmp$
/dev/fd/目录下有很多序号文件进程替换一般用的是 63 号文件该文件是系统内部文件我们一般查看不到。
我们通过下面的语句进行实例分析
echo shellscript (read; echo hello, $REPLY)
第一个表示输出重定向它把第一个 echo 命令的输出结果重定向到/dev/fd/63文件中。
()中的第一个命令是 read它需要从标准输入中读取数据此时就用/dev/fd/63作为输入文件把该文件的内容交给 read 命令接着使用 echo 命令输出 read 读取到的内容。
可以看到/dev/fd/63文件起到了数据中转或者数据桥梁的作用借助重定向它将()内部的命令和外部的命令联系起来使得数据能够在这些命令之间流通。