• LeekinDeveloper@Gmail.com

Linux Shell编程2


基础知识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
3
0:代表标准输入
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
2
$ ps -A > psout.txt
$ sort psout.txt > psout.out

如果使用管道符把他们连接,这两个任务将同时执行:

1
$ ps | sort > pssort.out

如果想在屏幕上分屏显示结果,可以连接第三个程序more:

1
$ ps | sort | more

然而可以连接的程序是没有上限的。