1 输入输出重定向

标准输入:从终端得到命令,对于计算机来说,是从终端获得了命令,执行完了以后,结果和执行状态或者错误提示又会发回终端,这叫标准输出。

输入输出重定向就是从终端以外的别的地方得到输入,或者向终端以外的别的地方输出。

命令和说明

command > file 将输出重定向到 file。
        command < file 将输入重定向到 file。
        command >> file 将输出以追加的方式重定向到 file。
        n > file 将文件描述符为 n 的文件重定向到 file。   #文件描述符,可以理解为内核给打开的文件的标识,它和文件不是一一对应的,0标准输入,1标准输出,2标准错误
        n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
        n >& m 将输出文件 m 和 n 合并。
        n <& m 将输入文件 m 和 n 合并。
        << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

    下面是详解:

2 输出重定向

    输出重定向一般在终端命令行里的比较多,在脚本比较少。

    实例1:echo "hello linux!">t3.sh    (hello linux就跑到t3,.sh里去了)想看的话需要cat t3.sh

    实例2:

demoFun(){
echo "这是我的第一个 shell 函数!" #这是函数主体,前一行后一行有大括号
}
demoFun >t3.sh #这是我的第一个 shell 函数! 就跑到t3.sh里去了

3 输入重定向

本来需要从键盘获取输入的命令会转移到文件读取内容。

command < filename  意思是把c o m m a n d命令以f i l e n a m e文件作为标准输入

实例1:wc -l <t3.sh(以t3.sh作为标准输入以后,算一算t3里有几行文件)说实话,此处的作用和wc -l t3.sh是一样的,但是运行方法还是不同的。

实例2:commed < infile > outfile,从文件infile读取内容,然后将输出写入到outfile中。

比如:sort <name.txt >name.out,

从name.txt中获取文件内容,排序以后输出到name.out中

补充:重定向操作符

        例子1:cat >> myfile <<MAYDAY     #<<MAYDAY的意思是,把MAYDAY和下一个MAYDAY(别的没有歧义的字符也可以)之间的内容当做输入,重定向到cat中,而>>myfile会把cat的内容输出重定向到myfile文件中。

    例子2:

$ sort << el    #任意字符都可以,常见的是EOF    #该命令的意思是把el和el之间的内容输入重定向到sort
heredoc> 345
heredoc> 123
heredoc> ndj
heredoc> abd
heredoc> el
#输出结果如下
123
345
abd
ndj

4 重定向的原理

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以这样写:command 2 > file

  如果希望标准错误和标准输出都重定向到一个文件中,可以这样写:command > file 2>&1  #理解为把标准错误先重定向到标准输出中,再把标准输出重定向到file中。

5 /dev/null约等于黑洞

    任何重定向到这个文件:/dev/null的输出,都不会有结果,因为它禁止输出。

6  永久重定向脚本中的所有输出

如果脚本中有大量的输出需要重定向,使用上面的临时重定向方式就非常繁琐,可以采用exec命令指定脚本生命周期内的重定向文件描述符,如下例子。

#!/bin/bash

# 在脚本执行期间所有的标准输出都会保存到文件syslog

exec > syslog    #把所有的标准输出全都输出到syslog去

dir=/home/yarn/bash01
for file in $dir/*
do
if [ -d "$file" ]
then
echo "$file is a directory!"
fi

7 在脚本中重定向输入

#!/bin/bash

exec  0< filename    #标准输入来自filename,filename的内容是:hehe \n  haha \n

while  read line
do
echo "From file parameter is $line"
done #得到结果:
hehe
haha

    通过exec命令把标准输入设备键盘重定向到文件,将配置信息写入到文件,在脚本中循环读取文件中的信息并赋值给变量并在脚本运行期间引用。通过read命令可以从命令行读取用户输入到的参数,当标准输入重定向到文件后,read命令同样可以从文件中读取记录。

        

shell编程 之 输入输出重定向的更多相关文章

  1. UC编程:输入输出重定向(标准IO)

    [c] #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char szBuf[100]; /* 将屏 ...

  2. shell编程-输入/输出重定向(十一)

    linux中文件描述符 linux跟踪打开文件,而分配的一个数字,通过这个数字可以实现对文件的读写操作 用户可以自定义文件描述符范围是:3-max,max跟用户的ulimit –n 定义数字有关系,不 ...

  3. Shell编程学习之重定向

    这一篇讲一下重定向 有些时候你想要保存某些命令产生的输出而不是在显示器上显示它. 为了应对这样的问题 bash shell 也就提供了一些重定向的操作符. 我们先了解一些基本的应用. 输出重定向 输出 ...

  4. Shell基础、输入输出重定向

    1.Shell的功能: (1)Shell是命令解释器,把我们写的命令转化为内核能够识别的机器语言,然后内核调用硬件来完成相应的操作.操作完成后,内核操作结果返回给内核,Shell再将机器语言翻译为我们 ...

  5. UC编程:输入输出重定向(系统调用)

    在Unix下,系统重定向是使用dup和dup2函数完成的 在学习使用这两个函数之前,必须要搞懂一个概念就是文件描述符 摘自:<文件描述符和文件指针的区别> 文件描述符就是open文件时产生 ...

  6. shell基础:输入输出重定向

    输出重定向将命令输出存入到文件,类似日志.便于查看.2和>>间没空格.但这种方法没用 ,命令执行时并不知道对错. /dev/null下的null就是一个垃圾箱,脚本中的一些命令并不需要保存 ...

  7. shell编程之输入输出

    1.输入 read命令有以下几种常见形式: read  var  :等待用户输入,从标准输入中读取一行并赋值给变量var read : 标准输入读取一行,并赋值给内置变量REPLY read -a a ...

  8. 【转】shell pipe与输入输出重定向的区别

    http://www.cnblogs.com/chengmo/archive/2010/10/21/1856577.html

  9. 全面理解Linux输入输出重定向

    全面理解Linux输入输出重定向 本教程通过视频方式讲解shell操作,理解感念,教程通俗易懂,比起看一大堆文档要舒服的多.本次教程主要讲解  Linux Shell 中支持输入输出重定向,用符号&l ...

随机推荐

  1. gradle 的jar下载到哪里了

    很好奇 gradle 的jar下载到哪里了,好顿翻,原来在C:\Users\(你的用户名)\.gradle\caches\modules-2\files-2.1目录下,使用gradle引用lib会先查 ...

  2. C++: 可变参数;

    可变参数,即参数的个数是动态变化的, 可多可少. 1. 可变参数: 可变参数一般采用”..."表示,用在宏上表示变参宏, 如: #define WriteLine(format,...) p ...

  3. MySQL数据库服务器整体规划(思路与步骤)

    MySQL数据库服务器整体规划(思路与步骤) 参考资料: http://blog.51cto.com/zhilight/1630611 我们在搭建MySQL数据库服务器的开始阶段就合理的规划,可以避免 ...

  4. mysql如何从全备文件中恢复单个库或者单个表

    mysql如何从全备文件中恢复单个库或者单个表 在mysql dba的日常实际工作中,一个实例下有多个库,而我们常见的备份就是全库备份.那么问题就来了,如果需要恢复单个库或者单个表,怎么办了,网上有很 ...

  5. 简洁架构的思想,基于go实现

    https://manuel.kiessling.net/2012/09/28/applying-the-clean-architecture-to-go-applications/ 从 Clean- ...

  6. centos之Too many open files问题-修改linux最大文件句柄数

    linux服务器大并发调优时,往往需要预先调优linux参数,其中修改linux最大文件句柄数是最常修改的参数之一. 在linux中执行ulimit -a 即可查询linux相关的参数,如下所示: [ ...

  7. spring XML配置参数替代properties文件

    xml中配置BEAN与参数 <bean id="beanXXX" class="com.benXXXX" init-method="initia ...

  8. 关于Mui严格模式下的报错解决方案

    前言:作为一名程序员遇到Bug总是在所难免的,但是记住"不二过",今天在Vue开发中遇到了一个报错让我纠结了许久,找了许久, 报错的原因是使用了mui导入其js文件导致的. 报错信 ...

  9. solrj管理索引库

    solrj管理索引库 1.1. 什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务, ...

  10. [Android] Android 让UI控件固定于底部的几种方法

    Android 让UI控件固定于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_p ...