电子商务与网站平台建设的关系,wordpress开启ssl变慢,虹桥做网站公司,企业电商网站备案流程前言 今天在写一个脚本时#xff0c;需要将shell命令和可执行程序的输出重定向在某一个log文件中#xff0c;但是遇到了点小问题#xff0c;索性就研究下输出重定向到底怎么回事。 Linux系统#xff0c;有一个非常重要概念#xff0c;就是一切皆文件。在使用shell脚本时需要将shell命令和可执行程序的输出重定向在某一个log文件中但是遇到了点小问题索性就研究下输出重定向到底怎么回事。 Linux系统有一个非常重要概念就是一切皆文件。在使用shell脚本时系统为了能够进行接收外部输入同时向外部输出将三个文件始终保持在打开的状态并使用三个文件描述符012来分别指向这三个文件以此来完成标准输入标准输出标准错误输出。 标准输入由键盘输入 标准输出输出到屏幕 标准错误输出到屏幕 在正常情况下我们执行shell命令时其输出总是标准输出或者标准错误因此总是会将输出的信息不论是正常信息还是报错信息都会打印在屏幕上但有时我们不希望这些输出打印在屏幕上而是希望这了信息能被保存到指定的文件中这就是输出重定向。 那么究竟什么是标准输入/标准输出/标准错误呢下面为大家一一介绍。
1.标准输出 在终端输入
echo hello
hello终端会打印hello但是我们echo出来的hello到底去了什么地方 每个基于 Unix 的操作系统都有一个“输出的默认位置”的概念。由于这个短语比较啰嗦所以大家都称它为“标准输出”或“stdout”读作standard out。 shell可能是 bash 或 zsh一直在监视默认输出位置。当 shell 在标准输出那里看到新的输出时它会将其打印在屏幕上以便我们可以看到它。否则shell不去监视标准输出位置echo hello会将“hello”发送到那个默认位置但我们却看不到。
2.标准输入 标准输入(stdin)是命令监听信息的默认位置尝试在终端输入cat不添加任何参数
cat
hello
hello
1234
1234不论输入什么shell会将你的输入再次打印shell怎么读取到你的输入呢和标准输出类似shell会一直监视默认输入位置一有新的输入进来shell便会把数据读进来然后输出到stdout。
3.标准错误 标准错误(stderr)和stdin/stdout很像区别就是stderr是错误信息存储的地方例如 cat一个不存在的文件
cat ttt
cat: ttt: No such file or directory似乎和stdout没什么两样但是我们借助管道来验证一下在linux中管道是将一个命令的stdout连接到另一个命令的stdin可以使用管道符号|来完成这个操作例如
echo hello there
hello there
echo hello there | sed s/hello/hi/
hi there这里的sed是将hello替换为hi上面命令中echo将hello there传输到标准输出然后通过管道将hello there将其作为标准输入传递给sedsed对其进行操作后再输出到标准输出。 那cat打印出的信息到底是stdout呢还是stderr呢看这个命令
cat ttt | sed s/No such/hello world/
cat: ttt: No such file or directory如果 cat ttt打印出来的信息是stdout的话那No such会被替换成hello world但似乎并没有被替换到是的cat ttt打印出的信息是stderr而不是stdout。管道只会接收stdout而不会接收stderr。
4. 重定向 这里我们终于可以知道什么是重定向了默认情况下我们shell执行的命令的输出一定会到stdout或者stderr如果我们不想让信息输出到stdout或者stderr那就要用到重定向了我们可以使用将输出进行重定向。
$ echo hello world file
$ cat file
hello world这行命令做了两件事
file不存在则创建file存在则用hello world覆盖其内容 如果只是想追加内容而不是覆盖原有内容则可以使用
$ echo hello world file
$ cat file
hello world
$ echo go go go file
$ cat file
hello world
go go go其中如果或者前不添加文件描述符则默认是将标准输出重定向到file如果想重定向stderr则需要表示为1 file或者2 file
5.文件描述符 文件描述符(File descriptor)是表示输入/输出源的正整数例如stdin是0stdout是1stderr是2这些数字是由POSIX标准定义的MacOS和Linux都实现了这个标准的一部分。
如果想将输出重定向到某一文件描述符则需要借助运算符并跟上文件描述符来完成
# Redirect stdout to stdout (FD 1)
echo hello there 1
hello there
# Redirect stdout to stderr (FD 2)
echo hello there 2
hello there这和上面的输出重定向到某一文件基本一样只不过重定向的最终目标变成了stdout和stderr让我们继续通过管道看看这两个输出有什么区别
echo no changes 1 | sed s/no/some/
some changes
# Redirect to stderr, so it does not come through
echo no changes 2 | sed s/no/some/
no changes原理还是和上面一样第一行将输出重定向到了标准输出所以管道会将其传递给sed第二行经echo的输出重定向到了标准错误管道无法传递。
6.将stderr重定向到stdout 如果一个脚本将输入的参数的三个参数分别重定向到了stdout stderr stdout那么一个命令就出现了两种不同的输出使用管道时就无法传递全部的输出作为下个命令的输入我们编写一个这样的command
#!/bin/bashfor f in $; doif [[ $f file2 ]]; thenecho stderr file2 2elseecho stdout $ffi
done$ bash command file1 file2 file3
stdout file1
stderr file2
stdout file3用管道来处理则只会处理部分file2是stderr无法被管道抓取。
$ bash command file1 file2 file3 | sed s/^/Robot says: /
stderr file2
Robot says: stdout file1
Robot says: stdout file3 我们可以通过21将标准错误重定向给标准输出例如
cat ttt 21 | sed s/No such/hello world/
cat: ttt: hello world file or directory由于stderr重定向到了stdout管道就将输出的信息传递给了sedsed做了处理并输出到stdout。
同样的对于command也可以这样做
dexu_tianVM-4-10-ubuntu:~/Tmp/outputRedirect$ bash ./command file1 file2 file3 21 | sed s/std/Robot says: std/
Robot says: stdout file1
Robot says: stderr file2
Robot says: stdout file37. 常用用法 比较常见的用法是将一个命令的stdout和stderr都重定向到某一个文件中那么它的写法就应该是这样的
cmd logfile 21cmd的stdout将会被重定向到logfilestderr将会被重定向到stdout由此实现了stderr和stdout被重定向到了logfile. 像21一样如果想重定向文件描述符则需要表示为N M其中N和M是文件描述符其为1和2时就是在重定向stdout和stdin了。如果M不是文件描述符则使用文件名Nfilename
8.输出静音 我们可以通过这种重定向的语法将所有的输出重定向到/dev/null 它会吞下所有接收到的内容并且不做任何操作。
echo hello there /dev/null
以上就是本文所要分享的内容希望大家每天坚持进步~