`

shell脚本的简单使用: 八——之输入输出重定向

阅读更多
shell输入输出重定向
就像是脚本运行时候的日志,你需要在某个文件中查看,我们需要将各个脚本的日志输出重定向到统一的某一个文件中,监控整个项目的执行情况。
输出重定向

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

#简单的使用
echo “少了个参数” > logs.log
echo "this is a error" >> logs.log
who >> logs.log

输入重定向
#显示文件名
wc -l logs.log
#不会显示文件名
wc -l < logs.log


先创建要进行后续测试的文件

echo -e "预先准备的测试文件";
echo "测试例子1." > temp.txt;
echo "测试例子 2." >> temp.txt;
cat temp.txt;
echo "a1" > a1;
echo "a2" > a2;
echo "a3" > a3;
sudo chmod 000 a3;
ls -alF a*;

//ls -F
//可执行文件, 添加一个后缀*;
//文件夹, 添加一个后缀/;
//软连接, 添加一个后缀@;


#获得shell执行后的返回值
echo -e "获得返回值"
ls + ;
echo -e "执行ls + ;后返回 $?"
ls -alF ./ ;
echo -e "执行ls -alF ./ ;后返回 $?"

#标准输出stdout的重定位。
echo -e "重定向到stdout !"
ls + > out.txt
echo -e "执行ls + > out.txt返回值为 $?"
echo -e "out.txt中的内容为"
cat out.txt
rm out.txt
#这里由于+在ls命令时候不合法,后续的out.txt中内容为空

echo "=========================================="

#获得shell执行后的返回值
echo -e "获得返回值"
ls + ;
echo -e "执行ls + ;后返回 $?"
ls -alF ./ ;
echo -e "执行ls -alF ./ ;后返回 $?"


echo "=========================================="
#标准输出stdout的重定位
echo -e "重定向到stdout !"
ls + > out.txt
echo -e "执行ls + > out.txt返回值为 $?"
echo -e "out.txt中的内容为"
cat out.txt
rm out.txt

echo "=========================================="


#标准错误stderr重定位
echo -e "重定向到stderr"
ls + 2> out.txt
echo -e "ls + 2> out.txt 执行后返回结果为 $?"
echo -e "查看out.txt的内容为"
cat out.txt
rm out.txt

#执行后同样是返回2但是错误信息重定向到out.txt的文件中
echo "=========================================="

#分别重定向标准stdout与标准错误stderr到指定的文件
echo -e "重定向标准stdin和stderr"
cat a* 2>stderr.txt 1>stdout.txt
echo -e "执行cat a* 2>stderr.txt 1>stdout.txt 返回值$?"
echo -e "执行后的stderr.txt内容为"
cat stderr.txt
echo -e "执行后的stdout.txt内容为"
cat stdout.txt
rm stderr.txt stdout.txt

echo "=========================================="

#使用2>&1把标准错误stderr重定向到标准输出stdout
echo -e "吧stderr重定向到标准输出stdout"
#也可以使用cat a* &>out.txt可以实现通用的效果
cat a* >out.txt 2>&1
echo -e "执行结果返回为 $?"
echo -e "out.txt内容为"
cat out.txt
rm out.txt

echo "=========================================="


#把标准错误stderr重定向到/dev/null
echo -e "将stderr重定向到/dev/null"
cat a* 2>/dev/null
echo "执行后返回的结果为:$?"
#"/dev/null" 是一个特殊的设备文件,所有输入到其中的比特流都会被丢弃


执行结果
获得返回值
ls: cannot access +: No such file or directory
执行ls + ;后返回 2
total 40
drwxr-xr-x 2 root root 4096 Apr 12 11:18 ./
drwxr-xr-x 3 root root 4096 Apr 11 14:28 ../
-rw-r--r-- 1 root root    3 Apr 11 22:36 a1
-rw-r--r-- 1 root root    3 Apr 11 22:36 a2
---------- 1 bin  root    3 Apr 11 22:36 a3
-rwxrwxrwx 1 root root 1788 Apr 12 11:01 ioe.sh*
-rw-r--r-- 1 root root    9 Apr 11 22:44 output.txt
-rw-r--r-- 1 root root    9 Apr 12 11:31 out.txt
-rw-r--r-- 1 root root 1210 Apr 11 22:44 redirect.sh
-rw-r--r-- 1 root root   48 Apr 11 22:36 temp.txt
执行ls -alF ./ ;后返回 0
==========================================
重定向到stdout !
ls: cannot access +: No such file or directory
执行ls + > out.txt返回值为 2
out.txt中的内容为
==========================================
重定向到stderr
ls + 2> out.txt 执行后返回结果为 2
查看out.txt的内容为
ls: cannot access +: No such file or directory
==========================================
重定向标准stdin和stderr
执行cat a* 2>stderr.txt 1>stdout.txt 返回值0
执行后的stderr.txt内容为
执行后的stdout.txt内容为
a1
a2
a3
==========================================
吧stderr重定向到标准输出stdout
执行结果返回为 0
out.txt内容为
a1
a2
a3
==========================================
将stderr重定向到/dev/null
a1
a2
a3
执行后返回的结果为:0
==========================================

把标准输出 stdout 重定向到 tee 的标准输入 stdin
//"cat a*" 的标准输出 stdout 通过pipe( "|" )重定向为 tee 的标准输入;
//tee 把这些信息重定向到 out.txt 的同时,输出到 tee 的标准输出 stdout ;
//tee 的标准输出通过 pipe("|") 重定向到了 "cat -n" 的标准输入;
cat a* | tee out.txt | cat -n;
//把标准错误也重定向到stdout
cat a* 2>&1 | tee out.txt | cat -n;
//添加-a追加输出信息
执行cat a* 2>stderr.txt 1>stdout.txt 返回值0

以上的结果分析
1)因为pipe("|") 只处理标准输出的信息,错误信息依旧在终端直接输出,没有被重定向处理;
2)tee 从它的标准输入 stdin 只接收到 a1、a2 的内容,通过 "cat -n" 给输出信息加上行号来标识出 tee 接收到的信息;
3)再通过查看 out.txt 文件,发现 tee 命令输出到 out.txt 的信息,与 "cat -n"的信息是一致的;

stdin 作为输入在使用cat时候的表现
cat --help #可以看见cat -等价于 /dev/stdin

ls -alF | cat
ls -alF | cat - #和上边输出一样,
ls -alF | cat -n #输出序号
ls -alF | cat /dev/stdin

cat < a1
cat < a2
cat < temp.txt

文本块重定向为 shell 命令的标准输入 stdin
cat <<ERR>log.txt
Hello word
ERR
cat log.txt
cat <<ERR >> log.txt
Nice to meet 
EOF
cat log.txt;




shell文件之间的引用调用
分享到:
评论

相关推荐

    《Shell脚本编程诀窍——适用于Linux、Bash等》.((英)Steve Parker).[PDF]@ckook-6

    Shell脚本编程是一种在Linux和类Unix操作系统中广泛使用的自动化工具,它允许用户通过命令行接口执行一系列操作,实现批处理、系统管理任务或者复杂的任务自动化。本书《Shell脚本编程诀窍——适用于Linux、Bash等》...

    100个Shell脚本经典案例pdf和强推250个拿来即用shell脚本pdf,2个pdf的合集,作为shell脚本学习资料

    这两个PDF合集——"100个Shell脚本经典案例"和"250个拿来即用shell脚本",为初学者和经验丰富的IT从业者提供了丰富的学习材料,帮助他们掌握和提升Shell脚本编写技能。 首先,让我们深入了解一下Shell脚本的基本...

    Shell脚本专家指南-中英文

    书中详细阐述了如何使用不同的文件描述符进行输入输出操作,以及如何通过重定向实现数据流的灵活控制。此外,还涵盖了管道和过滤器的概念,这是Unix/Linux系统中数据处理的重要方式。 正则表达式在文本处理中扮演着...

    Linux+shell编程课程设计——Linux用户管理的shell程序设计

    3. **脚本中的输入/输出重定向**:Shell脚本可以读取标准输入,写入标准输出,也可以通过重定向操作(如&gt;`&gt;`, `&gt;&gt;`, `)将数据流导向文件。在用户管理脚本中,可能需要将输出结果保存到文件,或者从配置文件中读取...

    linux与unix系统shell编程指南——2

    5. **输入/输出重定向**:介绍如何将命令输出重定向到文件(&gt;`&gt;`),追加到文件(`&gt;&gt;`),以及使用管道(`|`)连接多个命令。 6. **函数定义**:在Shell脚本中定义和调用函数,提高代码复用性和可读性。 7. **数组*...

    shell十三问——学习shell编程的好书

    用户可以改变命令的输入和输出流,例如将输出重定向到文件,或将输入从文件读取。 10. **管道 (Pipes)**: 使用管道可以将一个命令的输出作为另一个命令的输入,实现命令间的连接。 11. **条件测试 (Conditional...

    Linux——shell编程基础

    - **重定向**:使用 `和 `&gt;` 进行输入和输出重定向。 - 输入重定向:`sort 。 - 输出重定向:`sort &lt; unsorted.dat &gt; sorted.dat`。 - 示例:`find / -name test &gt; /dev/null 2&gt;&1` 的含义是搜索根目录下的名为 ...

    Shell基础——Shell入门资料

    - 重定向:`command &gt; file`将命令的输出重定向到文件,`command 将文件内容作为命令的输入。 6. **Shell参数和特殊变量** - `$0`:脚本的名称。 - `$#`:传给脚本的参数个数。 - `$*` 和 `$@`:所有参数作为一...

    关于shell脚本

    标题中的“关于shell脚本”指的是Unix/Linux操作系统中用于自动化任务和系统管理的脚本语言——Shell脚本。Shell脚本是一种解释型编程语言,它允许用户通过命令行界面(CLI)来执行一系列命令,而无需手动输入每个...

    linux实验——Shell编程.doc

    在这个实验中,我们将着重学习和实践Shell环境变量、管道(Pipeline)以及输入输出重定向等核心概念。 首先,**Shell环境变量**是Linux系统中用于存储系统或用户特定信息的数据结构。常见的环境变量有PATH(指定可...

    深入浅出linux工具与编程——Shell编程

    - **输入输出重定向**: 如`, `&gt;`, `&gt;&gt;`等。 - **管道**: 通过`|`连接多个命令,使得前一个命令的输出成为后一个命令的输入。 - **环境变量**: 如`PATH`, `HOME`等,用于存储系统配置信息。 - **位置参数**: 在脚本...

    Linux课件——第10章 Linux中的shell编程

    10.1 **Shell操作**主要包括对通配符的使用和输入/输出重定向。 **10.1.1 通配符与文件名变量**: 通配符在文件名匹配中扮演关键角色。例如,`[a-d]`匹配字符a到d,`x?y`匹配以x开头、以y结束且中间为任何单个字符...

    shell脚本按当前日期输出日志的实现

    在IT行业中,shell脚本是一种常用的自动化工具,尤其在服务器管理和系统维护中不可或缺。通过编写shell脚本,我们可以实现各种任务,例如数据备份、系统监控、日志管理等。本篇文章将详细介绍如何利用shell脚本来...

    Linux Shell 详解

    Linux 中的输入输出重定向和管道机制使得我们可以灵活地控制命令的输出流向,实现更为复杂的任务。 - **重定向操作**: - `&gt;`:覆盖重定向,将命令输出重定向到文件中,覆盖原有文件内容。 - `&gt;&gt;`:追加重定向,...

    shell 100例.rar

    6. 输入/输出重定向:使用`、`&gt;`、`&gt;&gt;`将命令的输出重定向到文件,或从文件读取输入。 7. 管道符:`|`用于连接多个命令,将一个命令的输出作为另一个命令的输入。 8. 脚本控制结构:如`case`、`break`和`continue`,...

    UNIXshell及其shell编程.ppt

    这一部分主要介绍UNIX文件系统的高级操作,特别是与Shell相关的输入输出重定向和错误流重定向,以及过滤命令如`cut`。 ### 8.1 Shell 读写文件与标准流 在UNIX系统中,数据被抽象为"流",分为标准输入流(stdin,...

    UNIX.Shell编程24学时教程

    6. **文件操作**:讲解读写文件、重定向输入输出、管道操作 (`|`) 和I/O重定向 (`、`&gt;`、`&gt;&gt;`),以及如何使用grep、sed和awk等工具处理文本。 7. **函数和脚本**:介绍如何定义和调用Shell函数,以及编写完整的...

    跟老男孩学Linux运维:Shell编程实战

    5. 输入/输出重定向:理解标准输入、输出和错误输出的概念,学会使用&lt;、&gt;、&gt;&gt;、2&gt;等重定向操作。 三、Shell命令和工具 1. 文件和目录操作:熟悉ls、cd、mkdir、rm、cp、mv等基本文件和目录操作命令。 2. 流程控制:...

    LINUX与UNIX SHELL编程指南——1

    同时,还会讲解输入/输出重定向、管道和进程控制,使读者能够灵活地操纵数据流。 第四部分:Shell脚本高级技巧 在这一部分,读者将接触到更多的高级Shell编程技术,如数组、命令别名、函数库、信号处理以及错误处理...

Global site tag (gtag.js) - Google Analytics