当前位置: 欧洲杯竞猜 > 服务器运维 > 正文

输出重定向,文件汇报符和重定向欧洲杯竞猜

时间:2019-10-29 13:41来源:服务器运维
linux 输入/输出重定向,linux重定向 文本陈诉符(fd)是与有些张开的公文或数额流相关联的平头。文件汇报符0,1,2是系统留住的。 0 ---- stdin(标准输入)1 ---- stdout(标准输出)2 ---- s

linux 输入/输出重定向,linux重定向

文本陈诉符(fd)是与有些张开的公文或数额流相关联的平头。文件汇报符0,1,2是系统留住的。

0 ---- stdin(标准输入)
1 ---- stdout(标准输出)
2 ---- stderr(标准错误)   

输入重定向的命令 < ,输出重定向的命令 > ;
错误重定向的命令 2>,追加重定向的命令 >> ;

重定向到文件

mkdir /tmp/10
cd /tmp/10
echo "123" > 1.txt
echo "456" >> 1.txt
cat 1.txt
#123
#456

ls   #错误重定向
#ls: cannot access  : NO such file or directory
ls   2> 1.txt
cat 1.txt
#ls: cannot access  : NO such file or directory

#还可以将stderr转换成stdout,使得stderr和stdout都被重定向到同一文件
#cmd > output.txt 2>&1   或者 cmd &> output.txt
ls   > output.txt 2>&1   #ls   &> output.txt
cat output.txt
#ls: cannot access  : NO such file or directory

#重定向到空设备
#/dev/null是一个空设备,向它写入的数组都会丢弃,但返回状态是成功的
ls   > /dev/null 2>&1
echo $?
#2 表示上条命令没有执行成功
#利用它的返回状态常用if判断中,如:
#检查多个主机是否存活 
for ip in 192.168.217.{1..3};do
        if ping -c 1 $ip >/dev/null;then
        #ping不通则为false
                echo "$ip ok"
        else
                echo "$ip no!"
        fi
done

redirect.sh

#!/bin/bash
cat << EOF >log.txt
Log file head
this is a test log file
function :system statistics
EOF

在cat << EOF >log.txt与下贰个EOF之间的兼具文件都会被充任stdin数据。log.txt的剧情如下:

sh redirect.sh
cat log.txt
#Log file head
#this is a test log file
#function :system statistics

read命令
read命令从正式输入中读取,并把读取的从头到尾的经过复制给变量。

#-p prompt  提示信息
read -p "please input your name:" name
#please input your name:James
echo $name
#James

#-a array   保存为数组,元素以空格分隔
read -p "please input your hobby:" -a arr
#please input your hobby:basketball pingpang running
echo ${arr[*]}
#basketball pingpang running

#read -d delimiter 持续读取直到遇到delimiter第一个字符退出
read -p "please input number of not 5:" -d 5
#please input number of not 5:4
#6
#5  遇到5返回

#-s 隐藏输入
#-t timeout 等待超时时间,秒


cat a.txt
#a b c
#1 2 3
#x y z
#while循环按行读取文件
cat a.txt |
while read line;do
echo $line
sleep 1
done

#重定向读取
while read line;do
echo $line
sleep 1
done < a.txt

#for循环读取
old_IFS=$IFS
IFS="n"
for i in `cat a.txt`;do
echo $i
sleep 1
done
IFS=$old_IFS


#分别变量赋值
read a b c
#1 2 3
echo $a $b $c
#1 2 3

15.1 明白输入和出口

目前明白二种显示脚本输出的不二秘技

1)在显示屏荧屏上海展览中心示

2)将出口文件重定向到文件中

【系统留住描述符】

15.1.1 规范文件描述符

Linux系统将各类对象当做文件管理。那蕴涵输入和数出进程。

Linux用文件陈说符来标记种种文件对象。

它是一个非负整数,能够唯风流倜傥标志会话中开发的文书。

每一种进程叁次最多能够有多少个文本汇报符

bash shell保留的前3个公文汇报符(0、 1、 2)

 

1.STDIN 正经输入(0)

STDIN文件表示shell的正统输入。

对终端界面来讲,规范输入是键盘。

shell从STDIN文件叙述符对应的键盘拿到输入,在客商输入时管理每一个字符

在运用输入重定向符号( < )时,Linux会用重定向钦定的文本来替换标准输入文件汇报符。它会读取文件并领取数据,就像是同它是键盘上键入的。

 

2.STDOUT 专门的学问输出(1)

STDOUT文件描述符代表shell的正经输出。

对终极分界面来讲,标准输出是终极荧屏。shell的有着出口会被定向到规范输出中。

也得以通过输出重定向( > )来纠正输出。通过输出重定向符号,能够将自然展现在显示屏上的出口重定向到钦点的文件。

>>  表示追加到文件

细心:用了输出重定向,shell并未有将错误音讯重定向到输出重定向文件中。错误新闻仍展览会示在显示器中。

 

3.STDE奥德赛本田CR-V 正式错误(2)

STDELAND奥迪Q3文件陈诉符来管理错误音信。

shell或shell中运作的前后相继新昌沪剧本出错开上下班时间生成的荒唐音讯都会发送到这一个职位。

默许情形下STROUT和STDE本田UR-V途睿欧指向相似的地点(显示屏)。然而STDE安德拉奥德赛不会趁着STDOUT重定向而发出改换。

 

0:stdin  标准输入

15.1.2 重定向错误

1.只重定向错误

将该文件陈诉符值(2)放在重定向符号(>)前面,必得挨着,不可能有空格。

诸如,查看叁个子虚乌有的文本:

$ls –al 2> log.txt

这种办法只会重定向错误音讯,普通输出不会被重定向。

 

  1. 重定向错误和数目

须要用多少个重定向符号,供给在符号后边放上待重定向数据所对应的公文描述符,然后钦赐用于保存数据的输出文件。

例如:

$ls -al test1 test2 test3 badfile 2> ErrLog.txt 1> DataLog.txt

表示将错误音信重定向到ErrLog.txt,平常输出重定向到DataLog.txt。

如此错误新闻和平常输出就分别在两文书了。

 

$ls -al test1 test2 test3 badfile &> AllLog.txt

这么表示将STDOUT和STDE中华V冠道重定向到同贰个文件AllLog.txt中了。

bash shell自动付与了错误新闻更加高的优先级,那样能够聚集浏览错误音讯了。

 

1:stdout  规范输出

15.2 在本子中重定向输出

有两种格局:

1)不经常重定向行输出

2)永恒重定向脚本中的全数命令

2:stderr  标准错误

15.2.1 有的时候重定向

能够独立将意气风发行重定向到STDE奥迪Q5Tucson。

比如:

echo “this is error msg” >&2

echo “this is normal msg”

 

健康运维不会见到哪些,可是若是运转时重定向了STDEWrangler奥迪Q3就有意思了。

$./test 2> Error.txt

就能够看来第生机勃勃行输出到了 Error.txt。而正规输出依旧在显示屏上。

 

典型错误输出的重定向方法:

15.2.2 永恒重定向

假诺有大气多少要求重定向,那么就能够相比费心。

新措施:用exec命令告诉shell在剧本实行时期重定向有个别特定文件叙述符

直接上例子:

1 #!/bin/bash

*  2 echo "this is error msg step1" >&2*

*  3 echo "this is normal msg step1"*

*  4 #地方没有重定向,所以依旧在显示屏输出。上面才起来重定向到需求的文件中*

*  5 exec 1>test2log.txt*

*  6 exec 2>test2Error.txt*

*  7 echo "this is error msg step2" >&2*

*  8 echo "this is normal msg step2"*

如此只要重定向了就很难改回去了。

 

方法一:cat linux.txt 2>  out.txt

15.3 在剧本中重定向输入

exec 命令允许你将STDIN重定向到Linux系统上的文本中。

事例:查看test第22中学的数据

*  1 #!/bin/bash*

*  2 exec 0< test2 # style="color: #ff0000">输入重定向到test第22中学*

*  3 echo "test2:"*

*  4 count=1*

*  5 while read line*

*  6 do*

*  7         echo "  $line"*

*  8         count=$[ $count 1 ]*

*  9 done*

 

方法二:cat linux.txt &>  out.txt

15.4 创立自身的重定向

在此以前说三个经过最多能够与9个展开的公文汇报符。别的6个(3 ~ 8)的文件呈报符均可用作输入或输出重定向。

能够将那几个文件陈诉符中的即兴三个分红给文件。

【tee命令】

15.4.1 创制输出文件汇报符

用exec命令给输出分配文件呈报符。

和正式的文书陈述符同样,风姿罗曼蒂克旦将另二个文件陈说符分配给了一个文书,这几个重定向就能直接有效,直到你重新分配。

例子:

*  1 #!/bin/bash*

*  2 exec 3>test4log.txt # exec 3>>test4log.txt 那个是将出口追加到现成文件*

*  3 echo "This is Normal msg"*

*  4 echo "This is fd:3 msg" style="color: #ff0000">>&3*

 

tee命令能够将数据重定向到文件,其他方面还足以提供豆蔻梢头份重定向数据的别本作为后续命令的stdin

15.4.2 重定向文件呈报符

于今牵线怎么过来已重定向的文件呈报符。

可以分配别的多个文件叙述符给标准文件描述符,反之亦然。

能够将STDOUT重定向到其它多少个文件描述符,然后再利用该文件呈报符重定向回STDOUT

例子:

*  1 #!/bin/bash*

*  2 # storing STDOUT, then coming back to it*

*  3 exec 3>&1 # 3 style="color: #ff0000">重定向到STDOUT。意味着给3的多少都将应时而生再显示器上*

*  4 exec 1>test5log.txt #

  • style="color: #ff0000">将STDOUT重定向到文件。然则3依然指向STDOUT原本的岗位,也正是显示屏。这时候给3发会突显在显示屏中。给STDOUT发会呈现在文件中

*  5 echo "This should store in the output file"*

*  6 echo "alone with this line."*

*  7*

*  8 exec 1>&3 # 将STDOUT重定向到3的日前岗位(也便是显示屏)*

*  9 echo "now things should be back to normal"*

 

在极端打字与印刷stdout同期重定向到文件中:

15.4.3 创制输入文件汇报符

跟上面相似,先将STDIN保存到别的三个文书描述符,然后读取完文件在将STDIN复苏

例子:

*  1 #!/bin/bash*

*  2 exec 6<&0 # 6先保存STDIN的位置*

*  3 exec 0<test5 # 将STDIN重定向到 test5*

*  4 count=1*

*  5 while read line*

*  6 do*

*  7         echo "  $line"*

*  8         count=$[ $count 1 ]*

*  9 done*

* 10*

* 11 exec 0<&6 #读取实现后将STDIN重定向到文件呈报符6,进而苏醒早先的职分*

* 12 read -p "Are you done now?" answer*

* 13 case $answer in*

* 14 Y|y) echo "GoodBye!!!";;*

* 15 N|n) echo "Sorry, this is the end";;*

* 16 *) echo "Error End";;*

* 17 esac*

 

ls | tee out.txt

15.4.4 创制读写文件汇报符

能够展开单个文件叙述符作为输入和出口。能够动用同贰个文本叙述符对同四个文件举办读写。

用起来要当心:由于是对同三个文件进行多少读写,shell会维护叁个里边指针,指明在文书中的当前岗位。任何读或写都是从文件指针上次的地点上马。

例子:

1 #!/bin/bash

*  2 exec 3<> testfile*

*  3 read line <&3*

*  4 echo "Read:$line" #小心这里写是从文件指针上次的职位上马,也便是读了一整套之后的岗位*

*  5 echo "Write: This is test line" >&3*

 

ls | tee out.txt | cat  -n

15.4.5 关闭文件呈报符

倘让你创制了新的输入或输出文件描述符,shell会在剧本退出时自动关闭它们。

而是有些时候依旧要和煦去关闭。

如何关闭: 就要关门的文书叙述符重定向到特殊符号 &-

倘诺关闭后,就不能够在本子中向她写入数据,不然shell会时有发生错误新闻。

例子:

*  1 #!/bin/bash*

*  2 # close fd test*

*  3 exec 3>test8log.txt*

*  4 echo "This is normal to fd:3" >&3*

*  5 exec 3>&-*

*  6 echo "after close write:his is normal to fd:3" >&3 #关门后再往里面写会出错*

*  7*

*  8 exec 3>test8log.txt # 那边一定于重新展开了*

*  9 echo "This is bad normal to fd:3" >&3 # 会覆盖原本的*

 

【重定向脚本内的文书片段(多行文本)】

15.5 列出张开的文书陈说符

lsof命令会列出任何linux系统张开的兼具的公文陈说符。会发生大批量出口。

还足以接选项和参数:

-p 前边接要查看的进程。  $$ 表示前段时间经过

-d 前边钦定要呈现的文本陈述符编号。

例子:

*  1 #!/bin/bash*

*  2 exec 3> testfile*

*  3 lsof -a -p $$ -d 0,1,2,3,4*

 

#!/bin/bash

15.6 阻止命令输出

一时候不想展现脚本的出口。能够将出口重定向到一个叫作null文件的特殊文件中去。

比如:

$ls –al > /dev/null

仍是可以够那样清空日志文件

$ cat /dev/null > TestLog.txt

 

 

cat <<EOF>text.log

15.7 创立有时文件

linux使用/tmp目录来存放在无需长久保存的文件。大多数linux发行版配置了系统在运转时自动删除/tmp目录下的具有文件。

系统上的别的顾客账户都有权力在读写/tmp目录中的文件。

mktemp能够在/tmp目录中开创多个唯风华正茂的一时文件。意气风发旦成立了文本,你就在剧本中有了总体的读写权限,外人不大概访谈它。

this is a text line1

15.7.1 成立本地一时文件

只必要钦点一个文件超级模特板就行了,在文件末尾加上6个X。

$mktemp testing.XXXXXX

小心:这里鲜明要有大写的X。这里的X有一些通配符的意思。仍然为能够写不是X的

mktemp命令的输出是它所创立的文书的名字。在剧本中保存起来,就会在背后的本子里引用了。

例子:

*  1 #!/bin/bash*

*  2 # create and using temp file*

*  3 tempfile=$(mktemp test10.XXXXXX)*

*  4 echo "tempfile = $tempfile"*

*  5 exec 3>$tempfile*

*  6 echo "This script writes to tmp file $tempfile"*

*  7 echo "this is first line" >&3*

*  8 echo "this is second line" >&3*

*  9 echo "this is third line" >&3*

* 10 exec 3>&-*

* 11*

* 12 echo  "Now delete file $tempfile"*

* 13 rm -f $tempfile > /dev/null*

 

this is a text line2

15.7.2 在/tmp目录创造一时文件

-t 选项会强制mktemp在系统的一时目录来成立该公文。

以当时候回来用来创制有时文件的全路径,并非独有文件名。

就地点的事例加上 –t就好了。

。。。

tempfile=$(mktemp -t test10.XXXXXX)

。。。

 

this is a text line3

15.7.3 创设有时目录

-d选项用来创设偶然目录。那样就能够用改目录实行别的供给的操作了。

例子:

*  1 #!/bin/bash*

*  2 # create and using temp dir*

*  3 tempdir=$(mktemp -d test12dir.12XXXX)*

*  4 cd $tempdir*

*  5 echo This in Dir:$(pwd)*

*  6 tempfile=$(mktemp test12.XXXXXX)*

*  7 echo "tempfile = $tempfile"*

*  8 exec 3>$tempfile*

*  9 echo "This script writes to tmp file $tempfile"*

* 10 echo "this is first line" >&3*

* 11 echo "this is second line" >&3*

* 12 echo "this is third line" >&3*

 

EOF

15.8 记录新闻

出口同不经常候发送到荧屏和日志文件,须要非常命令tee就能够了。

tee命令也便是管道第二个T型接头。它将STDIN过来的数码同一时间发往两处,风华正茂处是STDOUT,后生可畏处是钦命的公文。

比如:

$date | tee log.txt

$date | tee –a log.txt   # 这几个是将数据追加到文件中

例子:

*  1 #!/bin/bash*

*  2 # tee test*

*  3 echo "This is 1 msg" | tee test13log.txt*

*  4 echo "This is 2 msg" | tee -a test13log.txt*

*  5 echo "This is 3 msg" | tee -a test13log.txt*

 

【自定义文件汇报符】

15.9 实例

文件重定向常见于脚本须要读入文件和输出文件时。

急需:把数量数据放入石英手表格中(.csv文件),读取文件,创立INSERT语句。

例子:

*  1 #!/bin/bash*

*  2 outfile='members.sql'*

*  3 IFS=,*

*  4 while read name age sex num*

*  5 do*

*  6         cat >> $outfile << EOF*

*  7         insert into members (name, age, sex, num) values('$name', '$age', '$sex', '$num');*

*  8 EOF*

*  9 done <${1}*

1)${1}代表首先个命令行参数。它指明了待读取数据的公文

2)read会用IFS字符解析读入的文件,我们在那处将IFS钦命为逗号。

 

cat >> $outfile << EOF  // 这风度翩翩段依旧十分小清楚

那么些蕴藏多少个出口追加重定向(>>)和一个输入追加重定向(<<)。

>> 将cat命令的输出追加到由$outfile变量钦点的文书中。

cat命令的输入不在取自标准输入,而是被重定向到脚本中蕴藏的数目。

EOF符号标志了增到文件中的数据的起止。

 

输入文件 运维 结果:

 欧洲杯竞猜 1

说明:

出奇重定向(here document):

command << delimiter

         document

delimiter

功效是将多个delimiter之间的内容(document)作为输入传给command

注意:最终的delimiter一定要顶格写,不能够有空格

(1)

  6         cat >> $outfile << EOF

  7         insert into members (name, age, sex, num) values('$name', '$age', '$sex', '$num');

  8 EOF

(2)

  6         cat << EOF

  7         insert into members (name, age, sex, num) values('$name', '$age', '$sex', '$num');

  8 EOF

 

深褐高亮部分作为输入传给cat。(1)重定向到outfile去了,(2)仍然为明媒正娶输出(显示屏)

能够使用exec命令创设自定义文件描述符,文件的展开格局有只读情势,截断形式和增添格局。

<  操作符用于从文件中读取至stdin:

echo this is a test line > input.txt

exec 3<input.txt  //自定义文件陈述符3张开并读取文件

在指令中运用文件讲述符3:

cat <&3

this is a test line.

注意:这里只可以读取叁遍,要重新读取需求再一次制造文件汇报符。

> 操作符用于截断情势的文件写入(数据在文书内容被截断之后写入)

exec 4 >output.txt

echo this is a new line >&4

cat output.txt

this is a new line.

>>  操作符用于充实形式的文件写入(增多内容到文件中,原有内容不会舍弃)

exec 5>output.txt

echo  this is a new line >&5

cat output.txt

this is a new line

this is a appended line

编辑:服务器运维 本文来源:输出重定向,文件汇报符和重定向欧洲杯竞猜

关键词: 欧洲杯竞猜