Mac 命令学习 - 标准输入输出重定向

预备知识

文件描述符( File Descriptor )

在Unix 系统中文件描述符是用于访问文件、输入输出、管道、网络套接字的一个抽象概念[3]。文件描述符是一个非负的正整数,每一个Unix进程中都会有三个与标准流所对应的的POSIX文件描述符,分别为:

  1. stdin - 标准输入,提供给应用的标准输入。文件描述符为0
  2. stdout - 标准输出,程序的输出,在非重定向的情况下为终端。文件描述符为1
  3. stderr - 标准错误输出,程序的错误输出。文件描述符为2

关于文件描述符的详细,见文章{% post_link file_descriptor_101 文件描述符101 %}

输出重定向

有两种方式可以将输出重定向:

  • n> file 将文件描述符n重定向到文件file中,如果文件不存在则会创建文件,如果存在的话将会覆盖原有内容。
  • n>> file 将文件描述符n重定向到文件file中,如果文件不存在将会创建文件,如果存在则会在文件的结尾开始写入输出。

如果我们没有指定文件描述符,则默认为1,即标准输出。

重定向到不同的文件

我们可以把stdoutstderr输出到不同的文件,例子:

zhengyi$ ls
    file1 file2 file3
zhengyi$ ls f* e* 1>out.txt 2>err.txt
zhengyi$ cat out.txt
    file1
    file2
    file3
zhengyi$ cat err.txt
    ls: e*: No such file or directory

重定向到一个文件

很多情况下我们需要将stdoutstderr输出到同一个文件中,这个时候我们可以使用 &> or &>>,它们会把标准输出和标准错误输出到一起。

另外一种方法是利用m>&n,将某一个输出重定向到另一个输出中来。这个时候需要注意的是使用它们的顺序,比如下面这个例子: zhengyi$ ls f* z* 1>out.txt 2>&1 zhengyi$ cat out.txt ls: z*: No such file or directory file1 file2 file3 zhengyi$ ls f* z* 2>&1 1>out.txt ls: z*: No such file or directory zhengyi$ cat out.txt file1 file2 file3

ls f* z* 1>out.txt 2>&1这个例子是先将标准输出重定向到文件out.txt中,然后将标准错误重定向到标准输出中,这个是可以工作的。ls f* z* 2>&1 1>out.txt这个例子中,先将标准错误重定向到了标准输入,这个时候的标准输入指向的是默认的标准输入,而当后面将标准输入重定向到文件out.txt时,并不会改变标准错误的输出目标。

忽略某一些输出

比如说我们想要过滤输出中的错误,那么我们可以将标准错误输出到/dev/null中。

zhengyi$ ls f* z*
    ls: z*: No such file or directory
    file1 file2 file3
zhengyi$ ls f* z* 2>/dev/null
    file1 file2 file3

输入重定向

与输出重定向相反,输入重定向是利用"<"符号来表达的。例子:

zhengyi$ cat out.txt
    err.txt
    file1
    file2
    file3
    out.txt
zhengyi$ sort -r < out.txt
    out.txt
    file3
    file2
    file1
    err.txt

输出重定向可以和输入重定向组合起来一起使用,比如:

zhengyi$ sort -r < out.txt > sorted.txt

这个是将out.txt作为输入,然后把sort的结果重定向到sorted.txt中。同时使用输入和输出重定向的时候需要注意一点就是尽量避免使用同一个文件。比如说上面这个sort的例子,如果指向同一个文件,那么一开始输出重定向会先把out.txt文件清空。

参考资料

  1. Learn Linux, 101: Streams, pipes, and redirects
  2. I/O Redirection
  3. Wikipedia - File Descriptor

原文链接

时间: 2024-10-21 01:13:10

Mac 命令学习 - 标准输入输出重定向的相关文章

Shell学习之:输入输出重定向

详细理解: linux命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器.在linux shell执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件.由于文件描述符不容易记忆,shell同时也给出了相应的文件名: 文件描述符说明列表 文件 文件描述符 输入文件-标准输入 0(缺省为键盘;0为文件或其他命令的输出) 输出文件-标准输出 1(缺省为屏幕;1为文件) 错误

C标准输入输出重定向

C中的标准输入输出可以进行重定向到文件. 示例程序:(C Primer Plus示例8.2) // echo_eof.c -- 重复输入,直到文件的结尾 #include <stdio.h> int main(void) { int ch; while ( (ch = getchar()) != EOF) putchar(ch); return 0; } 编译运行.在终端中运行: >echo_eof.exe 则标准输入输出为键盘和显示屏. 同样的,将标准输入重定向到文件echo_eof.

linux 标准输入输出 重定向

背景: 屏幕打印不一定都是从标准输出来的,也包括标准错误输出流stderr中的信息 文件描述符定义(系统定义了12个) 0 标准输入 1 标准输出 2 标准错误 0 默认键盘输入 1,2默认从屏幕打印,可以重定向到其他文件 参考: 流,管道重定向[IBM]: http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-103-4/ 重定向执行顺序:http://blog.chinaunix.net/uid-25324849-id-3141027.h

Mac命令学习与积累

最近开始使用mac air,以前从来没有接触过IOS系统,各种操作捉急.Mac快捷键相当多,遇到各种操作不会就只好百度,然后整理了一堆有用或者没用的命令,一股脑儿列在下面.后续遇到的话还会再补充一些. ================================================= 查询运行文件所在路径 which ant 如果你安装好了ant,就会显示文件所在的路径 /usr/local/Cellar/ant/1.9.3/bin/ant ===================

标准输入输出重定向

程序会在运行中输出日志,并是通过java的日志类进行输出的.而如果关掉SSH运行程序,就会丢失这些信息.直观的解决办法是将输出到控制台的日志重定向到文件中,于是我将命令改为:sh auto.sh > console.txt &.不过事实并没像我想的那样,console.txt虽然被创建了,而日志并没有写在其中.后来请教Robert Chen,他让我用sh auto.sh >console.txt 2>&1 & 命令试一下,我输入了这个隐晦的命令之后,原本输出到控制

Mac/Linux 命令学习

干嘛要学命令 切换到mac下工作有一段时间了,难免要在终端中做一下操作,目前掌握的一些比较简单的命令行有时已经难以驾驭一些比较复杂的操作了.有必要系统得过一遍主要的一些命令. 除了装逼意外,命令行还在有很多好处: 打字的速度和准确性远远高于鼠标,频繁的切换鼠标和键盘是一件挺麻烦的事情. 命令行可以写成脚本自动化一些操作,懒人的福音. 在一些服务器的环境下只能使用命令行. 如何学命令 Learning by doing 是最好的方式,特别是对这种实用性的东西,不动动手是绝对不行的.我觉得学习命令行

实验理解Linux SHELL 输入输出重定向

在shell脚本中发现>/dev/null 2>&1这样的语句,以前没有去深入地理解这个命令的作用,这个命令和 2>&1 >/dev/null有什么区别?通过实验理解这两个命令及shell输入输出重定向的重点. shell重定向介绍 我们一般在使用shell命令的时候,多是通过键盘输入,在屏幕上查看命令的执行结果(包括正常输出与错误输出).如果某些情况下,我们需要将shell命令的执行结果存储到文件中,那么我们就需要使用输入输出的重定向. 文件描述符 当执行shel

linux学习(三)输入输出重定向和管道功能、cat命令、more命令

目录 输入输出重定向 输出重定向 管道功能 cat命令 more命令 @(输入输出重定向和管道功能) 输入输出重定向 输入重定向可以让用户将某个文件作为输入设备,输出重定向可以把某个文件作为输出设备,从而使文件更加灵活 输入重定向的符号使"<",执行该命令,"<"后面的文件替代用户从键盘的输入内容 例如将file文件的内容发送到某个邮箱 [[email protected] ~]#mail -s "test mail" [email 

标准输入输出,输出重定向

标准输入输出: 输出重定向: 正确输出和错误输出同时保存:  命令 &>/dev/null 这条指令把正确输出写入文件中,错误输出丢入黑洞 解释: 放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下 1 => stdout 2 => stderr 0 => stdin 换言之 2>1 代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1代表将stderr重定向到文件描述符