读取命令序列输出&&子shell&&父shell
将多个命令或工具结合起来一起输出。一个命令的输出可以当做另一个命令的输入,而这个命令的输出又可以作为另一个的输入。
这几个命令通常用通道(pipe)来链接,“|”。例如:
$cmd1 | cmd2 | cmd3
三个命令组合。cmd1将输出传给cmd2,cmd2的输出又传给了cmd3。
例子:
$ ls | cat -n > out.txt
ls的输出传给了cat -n ,cat -n 又将输出通过stdinc重定向写入out.txt中。
我们可以用字shell的方式来读取序列的输出:
cmd_output=$(COMMANDS)
例如:
cmd_output=$(ls | cat -n)
echo $cmd_output
命令会打印ls | cat -n 的结果。
我们还可以将$()换成``(反引用号与~符号在一块)
cmd_output=`ls | cat -n`
echo cme_output
我们在这里要补充一个概念————子shell和父shell
简单的理解:
我们打开一个终端,其实这就是一个父shell,当我们执行某个脚本xxx.sh时,执行xxx.sh脚本的时候其实系统就为我们打开了一个子shell。一旦子shell执行完成后,返回父shell。子shell的执行并不会对父shell有什么影响。
注意:
1.我们可以父shell中开启一个子shell,方法很简单:
pwd;
(cd /bin ;ls)
pwd;
两次pwd返回的结果最终显示是一样的。
2.
我们可以使用子shell或反引用的形式将命令读入变量中,但这里有一个问题我们需要注意。
$cat text.txt
1
2
3 f f f
$ out=$(cat text.txt)
$echo $out
1 2 3 f f f#我们注意到系统默认将\n和空格给省略了
$echo “$out”
1
2
3 f f f
这样我们就可以保留原格式来输出了。