基础知识2
重定向与管道
- 输入重定向
如果对C++的输出符号”>>”了解的话,我们在写控制台应用程序时,这是必不可少的,比如
std::cout>>"hello world!"
,这个语句将在屏幕上打印hello world,大家可能会疑惑,C语言是直接调用printf函数,传入要打印出来的字符串,C++却是使用重定向符号,是因为C++库在设计的时候重载了>>应算符,使得cout可以使用>>来连接字符串。回到Linux,同样可以使用重定向符,来完成一些非常复杂的任务,比如:
1 | $ ls -l > lsoutput.txt |
这个命令将会把ls命令原本要输出到屏幕的结果保存到文件lsoutput.txt,如果已经存在lsoutput.txt这个文件,默认请况下Linux将覆盖已经存在的文件,如果文件不存在,则创建,如果你要改变默认行为,则使用set -C或set -o noclobber来改变noclobber选项。重定向的功能非常强大,大家想想如果使用C++要写多少行代码才能实现输出到文件的功能。
NOTE:文件描述符1
2
30:代表标准输入
1:代表标准输出
2:代表标准错误输出
1 | $ ps -A >> lsoutput.txt |
这条命令将ps -A输出的结果附加到lsoutput.txt文件末尾
我们在使用kill命令终止某个线程时,往往会出现问题,在使用kill命令之前,要终止的线程已经停止了,这时候kill命令将会抛出错误信息,如果我们使用标准输出和标准错误输出1和2,就能将错误信息输出到文件:
1 | $ kill -HUP 1234 > killout.txt 2>killerr.txt |
这个命令将标准输出到killout.txt中,将标准错误输出到killerr.txt中,不过你也可以使用>&来链接两个输出:
1 | $ kill -1 1234 >killouterr.txt 2>&1 |
这个命令将标准错误输出和标准输出都重定向到一个文件中。
也可以使用Linux的通用”回收站”来有效的丢弃所有输出信息,如下:
1 | $ kill -l 1234 >/dev/null 2>&1 |
- 重定向输入
1
$ more < killout.txt
这条命令向linux shell传递命令,这些命令是我们预先写好的,希望linux的某个程序来接受这些命令,以此来按照我们的设定执行,这跟C++的
<<
符号是不是又有类似。
- 管道
在linux上面你可以使用管道符
|
来连接进程,linux和DOS不一样,linux下通过管道连接的线程可以同时运行,并随着数据流在他们之间的传递可以自动地进行协调。以下是不使用管道符来进行的操作,可分为两个部分:
1 | $ ps -A > psout.txt |
如果使用管道符把他们连接,这两个任务将同时执行:
1 | $ ps | sort > pssort.out |
如果想在屏幕上分屏显示结果,可以连接第三个程序more:
1 | $ ps | sort | more |
然而可以连接的程序是没有上限的。