`

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脚本语言.pdf

    * Shell 输入输出重定向是指在 Shell 中的输入输出操作 * Shell 输入输出重定向可以用来重定向输入输出流 Shell 文件包含: * Shell 文件包含是指在 Shell 中的文件包含操作 * Shell 文件包含可以用来包含其他...

    Shell 输入输出重定向.doc

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,...

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

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

    LinuxShell脚本学习基础视频

    资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...

    Linux-shell脚本全面学习.pdf

    * 在 shell 脚本中可以使用三类命令: Unix 命令、流程控制命令和 Shell 内置命令 * Unix 命令: + `echo`:将文字容打印在屏幕上 + `ls`:文件列表 + `wc`:计算文件行数、单词数和字符数 + `cp`:文件拷贝 + ...

    Linux Shell脚本教程:30分钟玩转Shell脚本编程 _

    Linux Shell脚本教程:30分钟玩转Shell脚本编程 _

    linux下输入输出重定向.docx

    Linux下的输入输出重定向 Linux下的输入输出重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变。默认情况下,Linux的输入是键盘,输出是显示器。但是,我们可以使用重定向来改变这些设置。 ...

    vim编辑器中掌握输入输出重定向与管道命令的应用

    掌握输入输出重定向与管道命令的应用 1.使用重定向 重定向就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为输入重定向、输出重定向和错误重定向。通常情况下,重定向到...

    [Ubuntu.Linux.基础视频教程].4.4.Shell.输入输出重定向

    [Ubuntu.Linux.基础视频教程].4.4.Shell.输入输出重定向

    109个shell脚本合集.pdf

    Shell脚本可以直接使用在Windows、Unix、Linux上面,并且可以调用大量系统内部的功能来解释执行程序。如果熟练掌握Shell脚本,可以让我们操作计算机变得更加轻松,也会节省很多时间。 以下是109个Shell脚本合集中...

    Linux操作系统shell脚本

    shell 脚本是 Linux 操作系统中最常用的自动化工具之一。 1. shell 脚本的三种运行方式: (1)设置脚本文件的可执行权限,指定脚本文件的绝对路径或相对路径直接执行 (2)使用 sh 或 bash 命令执行脚本文件,把...

    linux编写bash shell脚本文件.sh 自动输入密码.在脚本中使用sudo命令,将密码保存在脚本中,不需要手动输入密码

    linux bash shell脚本文件.sh,自动输入sudo的密码 在脚本中使用sudo命令,将密码保存在脚本中,不需要手动输入密码

    如何在Shell脚本中逐行读取文件.doc

    使用输入重定向是逐行读取文件的最简单方法。在while循环中使用输入重定向,可以读取文件的每一行内容。示例脚本如下: ```bash #!/bin/bash while read rows do echo "Line contents are : $rows " done ``` 这个...

    中北大学操作系统云沙箱实验报告-使用Shell脚本实现局域网MAC地址收集和FTP服务监控

    使用Shell脚本对局域网中的所有主机进行MAC地址的收集...创建Shell脚本文件,编写如下过程:首先创建端口存储文件,然后使用nmap命令根据IP地址检测21号端口的状态,最后根据状态信息通过重定向名输出到指定的文件中。

    输出执行操作和打印日志的shell脚本实例

    cat /mnt/log_function.sh #!/bin/bash #log function ####log_correct函数打印正确的输出到日志文件 function log_correct () { DATE=`date “+%Y-%m-%d %H:%M:%S”` ####显示打印日志的时间...log_error打印shell脚本

    Shell脚本中获取进程ID的方法

    比如,你可以使用shell脚本的PID在/tmp下创建一个唯一的临时文件。有时侯脚本需要检测所有运行的进程,它可以从进程列表中排除自身的子shell。 在bash中,子shell进程的PID存储在一个特殊的变量‘$$’中。这个变量...

    Shell脚本-从入门到精通.ppt

    八、shell脚本举例 1. echo命令:显示文字。 2. read命令:获取用户输入。 3. conditional结构:if、case、for、while、until等。 4. shell脚本的应用实例:自动执行一系列命令,实现批量处理任务。 九、shell...

    shell脚本学习手册

    Shell教程入门 3 1、shell脚本 3 2、shell脚本实践 4 ...Shell 输入/输出重定向 30 1、输出重定向 31 2、输入重定向 31 3、重定向深入讲解 31 4、Here Document 32 5、/dev/null文件 33 Shell文件包含 33

    Linux/Unix shell 脚本监控磁盘可用空间

    Linux下监控磁盘的空闲空间的shell脚本,对于系统管理员或DBA来说,必不可少。... # ——————————————————————————+ # CHECK FILE SYSYTEM SPACE BY THRESHOLD | # Filename:

    shell脚本与Makefile区别.docx

    shell 脚本和 Makefile 是两个不同的工具,它们都用于自动化构建和编译过程,但是它们有很大的不同之处。本文将详细介绍 shell 脚本和 Makefile 的区别。 首先,shell 脚本和 Makefile 都有自己独立的通配符,不能...

Global site tag (gtag.js) - Google Analytics