高校移动门户网站建设,wordpress教育类模板,英文网站建站公司,找网站建设企业1、文件描述符
文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。
在编写脚本的时候会频繁用到标准输入#xff08;stdin#xff09;、标准输出#xff08;stdoutstdin、标准输出stdout和标准错误stderr。脚本可以使用大于号将输出重定向到文件中。命令产生的文本可能是正常输出也可能是错误信息。默认情况下正常输出stdout和错误信息stderr都会显示在屏幕上。我们可以分别为其指定特定的文件描述符来区分两者。 文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符0、1以及2是系统预留的。
0—— stdin 标准输入。1—— stdout标准输出。2—— stderr标准错误。
# 使用大于号将文本保存到文件中echo This is a sample text 1 temp.txt# 使用双大于号将文本追加到文件中echo This is sample text 2 temp.txt
a. 退出状态
当一个命令发生错误并退回时它会返回一个非0的退出状态而当命令成功完成后它会返回为0的退出状态。退出状态可以从特殊变量$?中获得在命令结束之后立刻运行echo $?就可以打印出退出状态。
下面的命令会将stderr文本打印到屏幕上而不是文件中因为stdout并没有输出所以out.txt的内容为空
$ ls out.txt # 在屏幕上输出 ls: cannot access : No such file or director
在下面的命令中我们使用2数字2以及大于号将stderr重定向到out.txt
ls 2 out.txt #没有问题
可以将stderr和stdout分别重定向到不同的文件中
cmd 2stderr.txt 1stdout.txt# stdout.txt 文件中没有内容,stderr.txt文件中的内容如下:#bash: cmd: command not found...#Similar command is: mcd
下面这种更好的方法能够将stderr转换成stdout使得stderr和stdout都被重定向到同一个文件中
cmd output.txt 如果你不想看到或保存错误信息那么可以将stderr的输出重定向到/dev/null保证一切都会被清除得干干净净。
假设我们有3个文件分别是a1、a2、a3。但是普通用户对文件a1没有“读-写-执行”权限。如果需要打印文件名以a起始的所有文件的内容可以使用cat命令。来设置一些测试文件
echo A1 a1
echo A2 a2
echo A3 a3
chmod 000 a1 #清除所有权限# 切换普通用户 使用通配符a*显示这些文件内容的话系统会显示出错信息因为文件a1没有可读权限
cat a* 其中cat: a1: Permission denied属于stderr信息。我们可以将其重定向到一个文件中同时将stdout信息发送到终端
cat a* 2 err.txt # stderr被重定向到err.txtcat err.txt # 输出 cat: a1: Permission denied
我们在处理一些命令输出的同时还想将其保存下来以备后用。stdout作为单数据流singlestream可以被重定向到文件或是通过管道传入其他程序但是无法两者兼得。
有一种方法既可以将数据重定向到文件还可以提供一份重定向数据的副本作为管道中后续命令的stdin。
tee命令从stdin中读取然后将输入数据重定向到stdout以及一个或多个文件中command | tee FILE1 FILE2 | otherCommand 在下面的代码中tee命令接收到来自stdin的数据
它将stdout的一份副本写入文件out.txt同时将另一份副本作为后续命令的stdin。命令cat -n为从stdin中接收到的每一行数据前加上行号并将其写入stdout
cat a* | tee out.txt | cat -n cat out.txt # 输出 A2,A3
注意cat: a1: Permission denied 并没有在文件内容中出现因为这些信息被发送到了stderr而tee只能从stdin中读取。
默认情况下tee命令会将文件覆盖但它提供了一个-a选项可用于追加内容。 cat a* | tee -a out.txt | cat –n
要发送输入内容的两份副本给stdout使用-作为命令的文件名参数即可
echo who is this | tee -
也可以将/dev/stdin作为输出文件名来代替stdin。类似地使用/dev/stderr代表标准错误/dev/stdout代表标准输出。这些特殊的设备文件分别对应stdin、stderr和stdout。
b. 自定义文件描述符
文件描述符是一种用于访问文件的抽象指示器abstract indicator。存取文件离不开被称为“文件描述符”的特殊数字。0、1和2分别是stdin、stdout和stderr预留的描述符编号。exec命令创建全新的文件描述符。
如果你熟悉其他编程语言中的文件操作那么应该对文件打开模式也不陌生。常用的打开模式有3种 只读模式。 操作符可以将文件读入stdin。截断写入模式。操作符用于截断模式的文件写入数据在目标文件内容被截断之后写入。追加写入模式。操作符用于追加模式的文件写入数据被追加到文件的现有内容之后。
例1创建一个用于读取文件的文件描述符
echo this is a test line input.txt # 准备一个文件
exec 3input.txt # 定义文件描述符3将文件内容读入到标准输入中
cat3 # 使用文件描述符3输出this is a test line
如果要再次读取我们就不能继续使用文件描述符3了而是需要用exec重新创建一个新的文件描述符可以是4来从另一个文件中读取或是重新读取上一个文件。
例2创建一个用于写入截断模式的文件描述符
exec 4output.txt # 定义文件描述符4将内容截断写入至output.txt
echo newline 4 # 将内容写入文件
cat output.txt # 输出 newline
例3创建一个用于写入追加模式的文件描述符
exec 5input.txt # 定义文件描述符5将内容追加至input.txt
echo appended line 5 # 将内容追加入文件
cat input.tx # 查看输出内容
2、重定向操作符
重定向操作符和可以将输出发送到文件中而不是终端
先清空文件然后再写入内容将内容追加到现有文件的尾部。
默认情况下重定向操作针对的是标准输出。如果想使用特定的文件描述符你必须将描述符编号置于操作符之前。等同于1对于来说情况也类似即等同于1。
处理错误时来自stderr的输出被倾倒入文件/dev/null中。./dev/null是一个特殊的设备文件它会丢弃接收到的任何数据。null设备通常也被称为黑洞因为凡是进入其中的数据都将一去不返。
将文件重定向到命令?
借助小于号我们可以像使用stdin那样从文件中读取数据命令 文件
重定向脚本内部的文本块?
可以将脚本中的文本重定向到文件。要想将一条警告信息添加到自动生成的文件顶部可以使用下面的代码
#!/bin/bash
catEOFlog.txt
This is a generated file. Donot edit. Changes will be overwritten.
EOF
出现在cat EOFlog.txt与下一个EOF行之间的所有文本行都会被当作stdin数据。log.txt文件的内容显示如下