>

表现数据,输出重定向

- 编辑:金沙国际平台登录 -

表现数据,输出重定向

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卡塔 尔(英语:State of Qatar)

 

1.STDIN 正经输入(0卡塔尔

STDIN文件表示shell的正经八百输入。

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

shell从STDIN文件叙述符对应的键盘获得输入,在顾客输入时管理每种字符

在运用输入重定向符号( < 卡塔尔时,Linux会用重定向内定的文书来替换标准输入文件陈述符。它会读取文件并提取数据,就不啻它是键盘上键入的。

 

2.STDOUT 正规输出(1卡塔 尔(英语:State of Qatar)

STDOUT文件描述符代表shell的专门的职业输出。

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

也得以透过输出重定向( > 卡塔 尔(英语:State of Qatar)来更换输出。通过输出重定向符号,能够将自然突显在显示器上的输出重定向到钦赐的文书。

>>  代表追加到文件

专一:用了输出重定向,shell并未有将错误音信重定向到输出重定向文件中。错误新闻仍会展现在显示器中。

 

3.STDE奥德赛XC60 规范错误(2卡塔 尔(阿拉伯语:قطر‎

STDE昂科威宝马7系文件陈说符来管理错误信息。

shell或shell中运作的顺序和本子出错开上下班时间生成的谬误音信都会发送到这些岗位。

暗中同意景况下STROUT和STDE昂CoraPortofino指向同样的地点(显示屏卡塔尔。然则STDEPRADO昂科威不会趁机STDOUT重定向而爆发改换。

 

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和STDETucson汉兰达重定向到同一个文件AllLog.txt中了。

bash shell自动授予了不当消息越来越高的优先级,那样能够集中浏览错误音讯了。

 

15.2 在本子中重定向输出

有二种办法:

1卡塔 尔(阿拉伯语:قطر‎有时重定向行输出

2卡塔 尔(英语:State of Qatar)恒久重定向脚本中的全体命令

15.2.1 有时重定向

能够单独将风华正茂行重定向到STDEEscortTucson。

比如:

echo “this is error msg” >&2

echo “this is normal msg”

 

健康运作不会看到哪些,不过若是运转时重定向了STDEEvora奇骏就有趣了。

$./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"*

如此那般假若重定向了就很难改回去了。

 

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*

 

15.4 成立和煦的重定向

后边说一个历程最多能够与9个张开的文件呈报符。其余6个(3 ~ 8卡塔尔国的公文呈报符均可用作输入或输出重定向。

能够将那些文件陈说符中的轻便几个分配给文件。

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*

 

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"*

 

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*

 

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*

 

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*

 

15.6 阻止命令输出

临时不想展现脚本的出口。能够将出口重定向到几个称呼null文件的出格文件中去。

比如:

$ls –al > /dev/null

还足以如此清空日志文件

$ cat /dev/null > TestLog.txt

 

 

15.7 成立不时文件

linux使用/tmp目录来寄存在无需永恒保存的文本。大多数linux发行版配置了系统在运营时自动删除/tmp目录下的持有文件。

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

mktemp能够在/tmp目录中开创一个唯大器晚成的一时文件。生机勃勃旦创设了文本,你就在本子中有了完整的读写权限,外人不可能访谈它。

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*

 

15.7.2 在/tmp目录创立偶然文件

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

其不经常候回来用来成立一时文件的全路线,并不是独有文件名。

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

。。。

tempfile=$(mktemp -t test10.XXXXXX)

。。。

 

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*

 

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文件卡塔 尔(英语:State of Qatar),读取文件,创设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卡塔 尔(英语:State of Qatar)作为输入传给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卡塔尔国仍为行业内部输出(显示器)

本文由金沙国际平台登录发布,转载请注明来源:表现数据,输出重定向