【Linux】浅谈重定向与管道,return&exit没有效果???

重定向

重定向输出
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循环所在的子进程;
重定向是在一个进程执行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值