>

玩转Linux文件陈说符和重定向

- 编辑:乐百家599手机首页 -

玩转Linux文件陈说符和重定向

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

【系统留住描述符】

本文介绍linux普通话件汇报符与重定向的相关文化,文件陈说符是与公事输入、输出相关联的整数,它们用来追踪已展开的文书。有供给的相爱的神草考下。

15.1 精晓输入和出口

今昔晓得二种呈现脚本输出的法子

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

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

0:stdin  标准输入

原版的书文出处:

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.STDERAV4奥迪Q3 行业内部错误(2)

STDEKugaOdyssey文件陈述符来管理错误信息。

www.lo599.com,shell或shell中运作的先后黄岩乱弹本出错开上下班时间生成的荒谬消息都会发送到这么些地方。

暗中同意情形下STROUT和STDEENVISIONWrangler指向一样的位置(显示屏)。然而STDE汉兰达PRADO不会趁着STDOUT重定向而发生转移。

 

1:stdout  规范输出

linux下的文件叙述符是与公事输入、输出相关联的卡尺头。它们用来跟踪已展开的文书。
最分布的文书陈述符是stdin、stdout和stderr.大家得以将有些文件陈诉符的剧情重定向到另二个文本陈诉符中。

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科雷傲Enclave重定向到同贰个文件AllLog.txt中了。

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

 

2:stderr  标准错误

上面给出一些对文件陈诉符进行操作和重定向的事例。

15.2 在本子中重定向输出

有二种方式:

1)不常重定向行输出

2)恒久重定向脚本中的全部命令

行业内部错误输出的重定向方法:

1.5.1 预备知识

15.2.1 有的时候重定向

能够独立将一行重定向到STDE凯雷德LAND。

比如:

echo “this is error msg” >&2

echo “this is normal msg”

 

正规运作不会看到哪些,可是若是运维时重定向了STDE哈弗本田CR-V就有趣了。

$./test 2> Error.txt

就能够旁观第一行输出到了 Error.txt。而常规输出还是在显示屏上。

 

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

笔者们在编写制定脚本时会频仍利用正式输入(stdin)、标准输出(stdout)和正规错误(stderr)。

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 &>  out.txt

经过剧情过滤将出口重定向到文件是大家从事的基础职责之一。

15.3 在本子中重定向输入

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

事例:查看test2中的数据

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

 

【tee命令】

当命令输出文本时,这个输出文本有希望是错误新闻,也恐怕是例行的(非错误的)输出新闻。
单靠查阅输出的文书本人,  大家不恐怕区分哪些是正常的出口文本,哪些是荒谬文本。不过,大家能够通过文件陈说符来消除那个主题材料,将那多少个与特定描述符关联的文本提抽出来。
文件陈说符是与三个展开的公文或数额流相关联的板寸。文件汇报符0、1以及2是系统留住的。
0——stdin(规范输入)
1——stdout(规范输出)
2——stderr(规范错误)

15.4 创设自身的重定向

后边说二个进度最多能够与9个展开的文书陈诉符。其余6个(3 ~ 8)的公文陈诉符均可用作输入或输出重定向。

能够将那个文件陈诉符中的妄动四个分配给文件。

tee命令可以将数据重定向到文件,另一方面还足以提供一份重定向数据的别本作为延续命令的stdin

1.5.2  实战演习

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*

 

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

将出口文本重定向或保存到一个文件中:

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

 

ls | tee out.txt

 

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 | cat  -n

$echo"This is a sample text 1">temp.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*

 

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

 这种措施通过截取文件的秘籍,将出口文本存款和储蓄到文件temp.txt中,也正是说在把echo命令的出口写入文件以前,temp.txt中的内容首先会被清空。

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 # 会覆盖原本的*

 

#!/bin/bash

接下去,再看另一个例证:
$echo "this is sample text 2" >>temp.txt

15.5 列出张开的文书叙述符

lsof命令会列出成套linux系统张开的有所的文件陈述符。会发出多量出口。

还足以接选项和参数:

-p 后边接要查看的经过。  $$ 表示近年来历程

-d 后边内定要呈现的文书呈报符编号。

例子:

*  1 #!/bin/bash*

*  2 exec 3> testfile*

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

 

cat <<EOF>text.log

 这种方法会将文件追加到对象文件中。

15.6 阻止命令输出

有的时候不想体现脚本的出口。能够将出口重定向到四个誉为null文件的特种文件中去。

比如:

$ls –al > /dev/null

还能那样清空日志文件

$ cat /dev/null > TestLog.txt

 

 

this is a text line1

>和>>并分歧样。就算那多个操作符都足以将文件重定向到文件,不过前者会先清空文件,再写入内容;而前面一个会将内容扩张到存活文件的尾巴。
能够用上边包车型地铁艺术查看文件内容:

15.7 创造一时文件

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

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

mktemp能够在/tmp目录中开创多个独一的有的时候文件。一旦创制了文本,你就在本子中有了完整的读写权限,别人不能够访谈它。

this is a text line2

$cat temp.txt

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 line3

this is sample text 1
this is sample text 2

15.7.2 在/tmp目录创立不时文件

-t 选项会强制mktemp在系统的暂且目录来成立该文件。

以此时候回来用来创设有时文件的全路线,实际不是独有文件名。

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

。。。

tempfile=$(mktemp -t test10.XXXXXX)

。。。

 

EOF

 在linux操作系统中,当使用重定向操作符时,重定向的原委不会并发在终极,而是直接被导入文本。重定向操作符暗中同意使用正规输出。假诺想行使一定的文本描述符,你不可能不将汇报符置于操作符以前。

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*

 

【自定义文件呈报符】

>等同于1>;对于>>来讲,情况也近乎(即>>等同于1>>)。
来走访哪些是专门的学问错误以及怎么样对它重定向。当命令输出错误音讯时,stderr新闻就能被打字与印刷出来。思虑上边包车型大巴例证:
$ Is  

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*

 

可以使用exec命令创立自定义文件描述符,文件的开荒情势有只读情势,截断格局和充实格局。

Is:cannot access :No such file or directory 

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)依旧是职业输出(显示屏)

本文由乐百家服务器发布,转载请注明来源:玩转Linux文件陈说符和重定向