shell编程 之 输入输出重定向

1 输入输出重定向

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

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

    命令和说明bash

        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 之间的内容做为输入。函数

 

    下面是详解:spa

2 输出重定向

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

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

    实例2:blog

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 1> 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命令一样能够从文件中读取记录。

相关文章
相关标签/搜索