重定向
重定向输出
ls -l > lsout.txt
覆盖原文件
ls -l >> lsout.txt
追加的形式添加
kill -9 1234 > killout.txt 2> killerr.txt
标准正常输出保存在killout.txt,标准错误输出保存到killerr.txt
kill -9 1234 > killouterr.txt 2>&1
标准正常/错误输出均保存到killouterr.txt
kill -9 1234 > /dev/null 2>&1
程序执行在终端不显示任何信息
重定向输入
more < killout.txt
将killout.txt文件内容重定向输入到more中输出
管道
对ps的输出进行筛选等操作
方法一:
ps > psout.txt
sort psout.txt > spsout.txt
uniq spsout.txt > uspsout.txt
方法二:
ps|sort |uniq > uspsout.txt
方法二中的’|'就是管道命令的符号,注意管道符号两边的命令分别启动了不同的shell子进程执行,当配合return和exit使用时容易出现问题。下面演示了一个容易忽略的事故现场。
事故现场
观察一下脚本运行情况,其中test.conf有三行信息test1、return和test2
#!/bin/bash
test(){
cat test.conf |\
while read line
do
echo $line
if [ "$line"x = "returnx" ];then
return 1
fi
done
echo "no return"
}
test
运行结果
懵了,难道我用了个假return,不是return 1了吗?为什么函数后面的脚本还在执行,而且最后的返回状态是0,return 1函数不是应该返回1吗?
要不试下exit 1,返现效果一样,函数并没有exit!!!
假如将代码改成一下形式,把管道换成重定向
#!/bin/bash
test(){
while read line
do
echo $line
if [ "$line"x = "returnx" ];then
return 1
fi
done < test.conf
echo "no return"
}
test
这回return是我需要的效果!!!
总结
1、原来是一开始对return和exit的理解不正确,以为他们就是用来直接返回/退出函数的,单其实准确的说应该是返回/退出当前进程。
2、管道和重定向的一个重要区别
管道命令"|"符号左右两边分别起一个子进程运行命令,我们上面的return 1只是返回了while循环所在的子进程;
重定向是在一个进程执行的。