shell学习三十三天----关于重定向

关于重定向

额外的重定向运算符

使用set -C搭配

POSIX shell提供了防止文件意外截断的选项:运行set -C命令可打开shell所谓的禁止覆盖选项,当它再打开状态时,单纯的>重定向遇到目标文件已存在时,就会失败.>|运算符则能够另noclobber选项失效.

提供行内输入的<<和<<-:使用program<<得力miter,能够在shell脚本正文内提供输入数据;这样数据叫嵌入文件.在默认情况下,shell能够在嵌入文件正文内做变量.命令和算数替换.

#!/bin/bash

cd /home

du -s * |

sort -nr |

sed 10q |

while read amount name

do

mail -s "disk usage waring " $name<<EOF

Greetings ,You are one of the  top of 10 consumers of disk ...

Please clean up unneeded files ,as soon as possible

Thanks .

EOF

done

分析:当中邮件内容就是输入数据.

假设界定符以不论什么一种形式的引號括起来,shell便不会处理输入的内文,案例:

[[email protected] tmp]# i=5

[[email protected] tmp]# cat <<‘E‘OF

> this is the calue if i : $i

> here is a command sub :$(echo hello,world)

> EOF

this is the calue if i : $i

here is a command sub :$(echo hello,world)

界定符没有不论什么引號隔开

cat <<EOF

> this is the calue if i : $i

> here is a command sub :$(echo hello,world)

> EOF

this is the calue if i : 5

here is a command sub :hello,world

嵌入文件重定向器的另外一种形式有一个负号结尾.这样的情况下,全部开头的制表符(Tab)在传递给程序作为输入之前,都从嵌入文件与结束定界符中删除(注意:仅仅有开头的制表符会被删除,开头的空格不会删除).这么做,让shell脚本更易于阅读了.

以<>打开一个文件作为输入输出仅仅用

使用program<>file,可供读取与写入操作.默认是在标准输入上打开file.一般来说,<以仅仅读模式打开文件,而>以仅仅读模式打开.<>运算符则是以读取与写入两种模式打开给定的文件.这交由program确定并充分利用;实际上,使用这个操作符并不须要太多的支持.

文件描写叙述符处理

linux用文件描写叙述符来标示每个文件对象.文件描写叙述符是一个非负整数,能够唯一的标示回话中打开的文件.

bash保留了3个文件描写叙述符


文件描写叙述符


缩写


描写叙述


0


STDIN


标准输入


1


STDOUT


标准输出


2


STDERR


标准错误

STDIN文件描写叙述符代表shell的标准输入,对于终端来说,白鸟准输入就是键盘.

在使用输入重定向符号(<)时,linux会用重定向指定的文件来替换标准输入文件描写叙述符.

STDOUT文件描写叙述符代表标准的shell输出.在终端上,标准输出就是显示器.

使用输出重定向符号(>,>>),能够将要输出到显示上的内容从定向到指定的文件里.

STDERR文件描写叙述符用来处理错误消息,它代表shell的标准错误输出.

默认情况下STDOUT和STDERR指向相同的地方,默认情况下,错误消息也会输出到显示器输出.

重定向错误输出

仅仅重定向错误,例如以下:在上面的表中看到STDERR文件描写叙述符被设置成2

[[email protected] tmp]# ls t 2>error

[[email protected] tmp]# cat error

ls: 无法訪问t: 没有那个文件或文件夹

重定向错误和数据:

[[email protected] tmp]# mkdir task

[[email protected] tmp]# cd task/

[[email protected] task]# mkdir task

[[email protected] task]# ls task t 2>error 1>list

[[email protected] task]# cat list

task:

[[email protected] task]# cat error

ls: 无法訪问t: 没有那个文件或文件夹

分析:假设出现错误,就将错误信息放入error;假设正确,就将输出信息放到list中.

也能够将STDOUT和STDERR输出到同一个文件:

[[email protected] tmp]# mkdir task

[[email protected] tmp]# ls task t&>out

[[email protected] tmp]# cat out

ls: 无法訪问t: 没有那个文件或文件夹

task:

在脚本中重定向输出有两种方式:

1.暂时重定向每行输出

2.永久重定向脚本中的全部命令

先看第一种----暂时重定向

如要有益在脚本中生成错误消息,须要将单独的一行(echo &”error msg>” &2)输出重定向到STDERR.

案例:

#!/bin/bash

echo "error msg" >&2

echo "normal msg"

运行脚本,输出结果:

error msg

normal msg

分析:在重定向文件描写叙述符时,你必须在文件描写叙述符数字和输出重定向符号之间加上一个&符号.

默认情况下,linux会将STDERR定向到STDOUT.可是,假设在执行脚本时重定向了STDERR,脚本中全部定向到STDERR的文本都会被重定向,案例:

[[email protected] tmp]# ./test.sh 2>test

normal msg

[[email protected] tmp]# cat test

error msg

分析:把运行脚本的标准错误输出重定向到test,而在上一步中,将”error msg”定向到了标准错误输出.

另外一种----永久重定向

假设在脚本中有大量数据须要重定向,能够使用exec命令告诉shell在脚本运行期间重定向到某个特定文件描写叙述符:

bash代码:

#!/bin/bash

exec 1>testout

echo "error msg2"

echo "normal msg2"

echo "error msg1"

echo "normal msg1"

运行:

[[email protected] tmp]# ./test1.sh

[[email protected] tmp]# cat testout

error msg2

normal msg2

error msg1

normal msg1

在脚本中重定向输入:

使用exec命令将STDIN重定向到linux系统上的文件里:

exec 0< testfile

这个命令告诉shell从文件testfile中获得输入,而不是STDIN.

扩展exec命令:

语法:exec [ program [arguments...] ]

用途:

以新的程序代替shell,或改变shell本身的I/O设置.

主要选项:

行为:

搭配參数----也就是使用指定的程序代替shell,以传递參数给它.假设仅仅是用I/O重定向,则会改变shell本身的文件描写叙述符.

详细的參考:

http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html

时间: 2024-08-09 21:51:02

shell学习三十三天----关于重定向的相关文章

学习三十三

八周三次课(3月28日)10.32/10.33 rsync通过服务同步10.34 linux系统日志10.35 screen工具 扩展 Linux日志文件总管logrotate http://linux.cn/article-4126-1.html xargs用法详解 http://blog.csdn.net/zhangfn2011/article/details/6776925 rsync通过服务同步rsync可以增量拷贝,同时也支持远程同步rsync -av /etc/passwd /tmp

shell学习笔记之九(重定向)

重定向 概念: 将默认的输入输出改成其他的输入输出 文件标识符 linux使用0-9指明特定进程相关的数据流,系统在启动一个进程的时候会为该进程打开三个文件:标准输入(stdin),标准输出(stdout),标准错误输出,分别使用文件标识符0,1,2来标识,如果要为进程打开其他的输入输出,则需要从整数3开始标识.默认情况下,标准输入为键盘,标准输出和错误输出为显示器 I/O重定向 1.标准输出覆盖重定向(>) ls -l > test.txt 注意:如果指定的文件不存在,则命令会先创建文件 上

鸟书shell学习(三)shell脚本程序设计要点总结

一 注意事项 1.脚本的开头一行为 : #!/bin/bash 声明这个脚本需要的shell的名称 2.程序中出了"#!"之外的其他以#开头的都是注释内容 3.为了方面的使用系统命令,可以在程序的开始部分设置主要环境变量例如PATH 4.脚本程序的运行方法: sh example.sh 或者类似 bash example.sh chmod +x example.sh ; ./example.sh    ################################ 这两种执行方式都是

shell学习三十四天----printf详解

printf 先来看一个简单的例子:使用命令printf "hello,world\n", 输出:hello,world 再使用echo "hello,world\n",输出为:hello,world\n 案例二:使用命令printf "%s\n" hello,world 输出结果为:hello,world printf命令的完整语法有两个部分: printg format-string [arguments] 第一部分为描述格式规格的字符串,他

shell学习三十天----break,continue,shift,getopts

break和continue 这两个命令分别用来退出循环,或跳到循环体的其他地方. 使用while与break,等待用户登录 bash代码: printf "Enter username: " read user while true do if who | grep "$user" >/dev/null then break; fi sleep 30 done 等待特定用户,每30秒确认一次 true命令什么事也不必做,只是成功的退出.这用于编写无限循环,即

shell学习三十八天----执行顺序和eval

执行顺序和eval shell从标准输入或脚本中读取的每一行称为管道,它包含了一个或多个命令,这些命令被一个或多个管道字符(|)隔开. 事实上嗨哟很多特殊符号可用来分割单个的命令:分号(;),管道(|),&,逻辑AND(&&),逻辑OR(||).对于每一个地区的管道,shell都会将命令分割,为管道设置I/O,并且对每一个命令依次执行下面的操作. 看起来很复杂,但是每一个步骤都是在shell的内存里发生的,shell不会真的把每个步骤的发生演示给我们看.所以这是我们分析shell内

shell学习三十五天----波浪号展开与通配符

波浪号展开与通配符 shell中两种与文件名相关的展开.第一种是波浪号展开,第二种是通配符展开式. 波浪号展开 如果命令行字符串的第一个字符为波浪号(~),或者变量指定(例如PATH或CDPATH变量)的值里任何未被引号括起来的冒号之后的第一个字符为波浪号(~)时,shell变回执行波浪号展开. 波浪号展开的目的,将用户根目录的符号型表示方式,改为实际的目录路径.可以采用直接或间接的方式指定执行此程序的用户,如未明白指定,则为当前的用户: 命令:vi ~/.profile       与vi $

shell学习三十一天----函数问题

函数 案例一: #!/bin/bash hello () { echo "hahahah" } hello 执行函数,结果为:hahaha 案例二: #!/bin/bash funWithReturn() { echo "the function is to get the sum of two number" read -p "input first number" num1 read -p "input second number&

shell学习三十七天----引用

引用 案例,如果我想输出一个星号(*),使用echo如何做? echo * 这是肯定不行的,需要将*转移,即:echo \* 这样就引出了引用的概念.所为引用,是用来防止shell将某些你想要的东西解释成不同的意义.如果你希望某些可能被shell视为个别参数的东西保持为单个参数,这时你就必须将其引用. 引用的三种方式: 反斜杠转义 字符前置反斜杠(\),用来告知shell该字符即为其字面上的意义. 单引号 单引号('...')强制shell将一对引号之间的所有字符都看做其字面上的意义.shell